我有两个data.table
如下所示:
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
不太正确。我是新手。我想有一种比上下循环两个数据表更快的方法。
我想知道上面显示的循环是否可以简化/矢量化。
编辑用于复制/粘贴的 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
该算法在一张表中向下,对于每一行在另一张表中向上,检查一些条件并相应地修改值。更具体地说,它下降 B.DT,对于 B.DT 中的每一行,上升 A.DT 并将 b1 的第一个值分配给 a2,使得 b1 小于 a1。在赋值之前检查一个附加条件(在本例中 b2 等于或小于 5)。
0.64229018 是 B.DT 中的第一个值,分配给 A.DT 的最后一个单元。1.00527902 是 B.DT 中的第二个值,但由于它比 A.DT 中的所有其他值都大,因此未赋值。0.24746294 是 B.DT 中的第三个值,分配给 A.DT 中倒数第二个单位。-0.50288835 是 B.DT 中的第四个值,分配给 A.DT 中的 #8 单元 0.34447791 是 B.DT 中的第五个值,因为它太大了,所以没有分配。
这当然是一个简化的问题(因此可能没有多大意义)。感谢您的时间和投入。