私のdata.tableに新しい列を追加したいと思います。この列には、特定の条件を満たすすべての行の別の列の合計が含まれている必要があります。例:( - T [X] Tが[i])と< = 10、私は条件のdata.tableを自己結合する方法
を計算したいすべての行xと行ごとに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
私、ABSは、ここで私のdata.tableは、このようになります
foo = sum(v[i] * abs(t[i] - t[x]))
SQLでは、自己結合を使用してこれを解決します。
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
は、残念ながら、私はかなり頻繁にこれをしなければならないと私が一緒に仕事表がかなり大きい:Rで私は、forループを使用して、これを行うことができました。 forループアプローチは機能しますが、遅すぎます。私は本当のブレークスルーを伴わずにsqldfパッケージを使いました。私はいくつかのdata.table魔法を使ってこれをやりたいと思います。あなたの助けが必要です:-)。私は、必要とされるのは、t値の差が閾値より小さいという条件で、何らかの自己結合であると思います。
フォローアップ: フォローアップの質問があります。私のアプリケーションでは、この結合は何度も何度も繰り返されています。 vの変化ですが、tとnは常に同じです。だから私は何とか一緒に属している行を格納することを考えています。どのように賢い方法でこれを行うための任意のアイデア?
出力から、 'i!= x'という条件も正しいように見えますか? –
いいえ。項abs(t-DT [i] $ t)== 0であるため、行9 foo = 0の場合。しかし、私のアプリケーションでの計算がこの例のようにもう少し複雑で、そこにx行が必要なので、i!= xは除外すべきではありません。 – uuazed