gpt4 book ai didi

data.table 中的行条件列操作

转载 作者:行者123 更新时间:2023-12-04 01:10:08 25 4
gpt4 key购买 nike

我有一个很大的 data.table,我需要根据完整的 data.table 的一部分对每一行进行计算。作为一个例子,考虑下面的data.table,并假设我对于每一行想要计算每行的 num 变量的总和,其中 id2 匹配当前行的 id1 以及时间变量在距离时间为 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 执行此类操作的正确/快速方法是什么?

最佳答案

我们可以在此处通过创建“timeminus2”和“timeplus2”列来使用自联接,联接 on通过 'id2' 与 'id1' 和非等逻辑条件得到 sum 'num' 并将 ( := ) 'val' 列分配给原始数据集

tmp <- dat[.(id1 = id1, timeminus2 = time - 2, timeplus2 = time + 2), 
.(val = sum(num)),
on = .(id2 = id1, time >= timeminus2, time <= timeplus2),
by = .EACHI
][is.na(val), val := 0][]
dat[, val := tmp$val][]
# 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 中的行条件列操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48092348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com