RI を使用するときは、「可能であればループの使用を避ける」ことを常に念頭に置いてください。しかし、私は今立ち往生しています。必要なものをコーディングするCRANTASTICの方法を見つけることができませんでした。
記録のために、いくつかのコメントの後、上記の私のステートメントは正しいステートメントではありません。効率を改善するためにここでループを避ける必要はありません。
入力として 2 つの文字列ベクトルを持ってa
いb
ます。"M"
"I"
"D"
a = c("M","I","D","D","M","M","M","M","M","M")
b = c("M","M","M","M","M","M","D","M","M")
私の望ましい出力は次のとおりです。
d = c("M","I","D","D","M","M","M","M","I","M","M")
次の関数は、そのような出力を提供します。
my.function <- function(a, b)
{
nrow.df = length(a) + length(which(b=="D"))
my.df = data.frame(a = rep(NA, nrow.df),
b = rep(NA, nrow.df),
d = rep(NA, nrow.df))
my.df$a[1:length(a)] = a
my.df$b[1:length(b)] = b
for (i in 1:nrow.df)
{
if(my.df$a[i] == "D") {
my.df$d[i] = "D"
my.df$b[(i+1):nrow.df] = my.df$b[i:(nrow.df-1)]
} else if (my.df$b[i] == "D") {
my.df$d[i] = "I"
my.df$a[(i+1):nrow.df] = my.df$a[i:(nrow.df-1)]
} else if (my.df$a[i] == "I") {
my.df$d[i] = "I"
} else if (my.df$b[i] == "I") {
my.df$d[i] = "D"
} else {
my.df$d[i] = my.df$a[i]
}
}
return(my.df$d)
}
> d = my.function(a,b)
> d
[1] "M" "I" "D" "D" "M" "M" "M" "M" "I" "M" "M"
関数のロジックは次のとおりです。 in がある場合は常に"D"
ina
を入れてベクトルを 1 シフトし、"D"
逆に in がある場合は常にinを入れて 1シフトします。 d
b
"D"
b
"I"
d
a
次に、 in があって"I"
ina
がない場合は"D"
inb
を入れ、逆に"I"
inがあってinがない場合はinを入れます。そうでなければ、.a
"I"
b
"D"
a
"D"
d
d = a
複雑な関数ではありませんが、R を効率的にする方法に苦労しています。私はこの関数を mclapply で何百万回も適用しているので、そのような関数を高速に実装することで多くの時間を節約できます。
Rcppの使用をお勧めしますか? それははるかに速いでしょうか?R と Cpp の何百万回もの通信で速度が低下することはありますか、それとも Rcpp では自動ですか?