data.table
以下に示すように、2つの s があります。
N = 10
A.DT <- data.table(a1 = c(rnorm(N,0,1)), a2 = NA))
B.DT <- data.table(b1 = c(rnorm(N,0,1)), b2 = 1:N)
setkey(A.DT,a1)
setkey(B.DT,b1)
以下に示すように for ループを変更して、以前data.frame
の実装を実装に変更しようとしました。data.table
for (i in 1:nrow(B.DT)) {
for (j in nrow(A.DT):1) {
if (B.DT[i,b2] <= N/2
&& B.DT[i,b1] < A.DT[j,a1]) {
A.DT[j,]$a2 <- B.DT[i,]$b1
break
}
}
}
次のエラー メッセージが表示されます。
Error in `[<-.data.table`(`*tmp*`, j, a2, value = -0.391987468746123) :
object "a2" not found
アクセス方法がいまいちだと思いますdata.table
。私はそれに慣れていません。2 つのデータテーブルを上下に循環させるよりも簡単な方法があると思います。
上記のループを単純化/ベクトル化できるかどうかを知りたいです。
コピー/貼り付け用の data.table データを編集します。
# A.DT
a1 a2
1 -1.4917779 NA
2 -1.0731161 NA
3 -0.7533091 NA
4 -0.3673273 NA
5 -0.159569 NA
6 -0.1551948 NA
7 -0.0430574 NA
8 0.1783496 NA
9 0.4276034 NA
10 1.0697412 NA
# B.DT
b1 b2
1 0.64229018 1
2 1.00527902 2
3 0.24746294 3
4 -0.50288835 4
5 0.34447791 5
6 -0.22205129 6
7 0.60099079 7
8 -0.70242284 8
9 0.6298599 9
10 0.08917988 10
私が期待する出力:
# OUTPUT
a1 a2
1 -1.4917779 NA
2 -1.0731161 NA
3 -0.7533091 NA
4 -0.3673273 NA
5 -0.159569 NA
6 -0.1551948 NA
7 -0.0430574 NA
8 0.1783496 -0.50288835
9 0.4276034 0.24746294
10 1.0697412 0.64229018
アルゴリズムは 1 つのテーブルを下に移動し、行ごとにもう一方のテーブルを上に移動し、いくつかの条件を確認し、それに応じて値を変更します。より具体的には、B.DT を下に移動し、B.DT の各行に対して A.DT を上に移動し、b1 が a1 より小さくなるように b1 の最初の値を a2 に割り当てます。割り当ての前に、追加の条件がチェックされます (この例では、b2 が 5 以下である)。
0.64229018 は B.DT の最初の値であり、A.DT の最後のユニットに割り当てられます。1.00527902 は B.DT の 2 番目の値ですが、A.DT の他のすべての値よりも大きいため、割り当てられていません。0.24746294 は B.DT の 3 番目の値であり、A.DT の最後から 2 番目の単位に割り当てられます。-0.50288835 は B.DT の 4 番目の値であり、A.DT のユニット #8 に割り当てられています。0.34447791 は B.DT の 5 番目の値であり、大きすぎるため割り当てられていません。
もちろん、これは単純化された問題です (したがって、あまり意味がないかもしれません)。お時間をいただきありがとうございます。