我有一个大的data.table,其中每行我需要根据完整data.table的一部分进行计算。作为一个例子,考虑以下data.table,并假设我为每一行想要计算id2与当前行的id1匹配的每一行的num变量的总和,以及时间变量在距离时间1的距离内。当前行。
set.seed(123)
dat <- data.table(cbind(id1=sample(1:5,10,replace=T),
id2=sample(1:5,10,replace=T),
num=sample(1:10,10,replace=T),
time=sample(1:10,10,replace=T)))
这可以通过循环遍历每一行来轻松完成
dat[,val:= 0]
for (i in 1:nrow(dat)){
this.val <- dat[ (id2==id1[i]) & (time>=time[i]-2) & (time<=time[i]+2),sum(num)]
dat[i,val:=this.val]
}
dat
结果data.table如下所示:
> dat
id1 id2 num time val
1: 2 5 9 10 6
2: 4 3 7 10 0
3: 3 4 7 7 10
4: 5 3 10 8 9
5: 5 1 7 1 2
6: 1 5 8 5 6
7: 3 2 6 8 17
8: 5 1 6 3 10
9: 3 2 3 4 0
10: 3 5 2 3 0
使用data.table执行此类操作的正确/快速方法是什么?
答案 0 :(得分:5)
我们可以通过创建'timeminus2'和'timeplus2'列来使用自联接,通过'id2'加入on
和'id1'以及非等概率条件来获得{{1 'num'并将(sum
)'val'列分配给原始数据集
:=