我想在我的 data.table 中添加一个新列。此列应包含满足特定条件的所有行的另一列的总和。一个例子:我的 data.table 看起来像这样:
require(data.table)
DT <- data.table(n=c("a", "a", "a", "a", "a", "a", "b", "b", "b"),
t=c(10, 20, 33, 40, 50, 22, 25, 34, 11),
v=c(20, 15, 16, 17, 11, 12, 20, 22, 10)
)
DT
n t v
1: a 10 20
2: a 20 15
3: a 33 16
4: a 40 17
5: a 50 11
6: a 22 12
7: b 25 20
8: b 34 22
9: b 11 10
对于每一行 x 和每一行 i,其中 abs(t[i] - t[x]) <= 10,我想计算
foo = sum( v[i] * abs(t[i] - t[x]) )
在 SQL 中,我会使用自连接来解决这个问题。在 RI 中,使用 for 循环能够做到这一点:
for (i in 1:nrow(DT))
DT[i, foo:=DT[n==DT[i]$n & abs(t-DT[i]$t)<=10, sum(v * abs(t-DT[i]$t) )]]
DT
n t v foo
1: a 10 20 150
2: a 20 15 224
3: a 33 16 119
4: a 40 17 222
5: a 50 11 170
6: a 22 12 30
7: b 25 20 198
8: b 34 22 180
9: b 11 10 0
不幸的是,我必须经常这样做,而且我使用的桌子更大。for 循环方法有效,但速度太慢。我玩弄了 sqldf 包,没有真正的突破。我很想使用一些 data.table 魔法来做到这一点,我需要你的帮助:-)。我认为需要的是某种自连接,条件是 t 值的差异小于阈值。
跟进: 我有一个跟进问题:在我的应用程序中,这个加入被一遍又一遍地完成。v 发生了变化,但 t 和 n 始终相同。所以我正在考虑以某种方式存储哪些行属于一起。任何想法如何以聪明的方式做到这一点?