我想添加一個新的列到我的data.table。此列應包含滿足特定條件的所有行的另一列的總和。一個例子:我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 [1] - 噸[X])< = 10,欲計算
foo = sum(v[i] * abs(t[i] - t[x]))
在SQL中,我會用自連接來解決這個問題。在R I是能夠做到這一點使用一個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-loop方法有效,但速度太慢。我玩過sqldf軟件包,沒有真正的突破。我很樂意使用一些data.table魔術來做到這一點,我需要你的幫助:-)。我認爲在t值的差值小於閾值的條件下,需要某種自加入。
追問: 我有一個跟進的問題:在我的應用程序此連接一遍又一遍做。 v的變化,但t和n都是一樣的。所以我正在考慮以某種方式存儲哪些行歸在一起。任何想法如何以聰明的方式做到這一點?
從你的輸出中,它看起來像你還有一個條件'我!= x'是否正確? – 2013-02-20 16:19:56
編號對於第9行foo = 0,因爲術語abs(t-DT [i] $ t)== 0。但是我不應該排除i!= x,因爲在我的應用程序中的計算有點複雜,因爲在這個例子中我需要x行。 – uuazed 2013-02-20 16:26:52