Chcę dodać nową kolumnę do mojego data.table. Ta kolumna powinna zawierać sumę innej kolumny wszystkich wierszy spełniających pewien warunek. Przykład: My data.table wygląda następująco:Jak samodzielnie dołączyć do data.table pod warunkiem
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
dla każdego wiersza i każdej x rzędu i, gdzie ABS (t [b] t - [X]) < = 10, że aby obliczyć
foo = sum(v[i] * abs(t[i] - t[x]))
W SQL rozwiązałem to za pomocą samołączenia. W badania udało mi się to zrobić za pomocą pętli 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
Niestety muszę to robić dość często i tabela pracuję jest raczej większa. Podejście pętli for działa, ale jest zbyt wolne. Grałem z pakietem sqldf, bez prawdziwego przełomu. Chciałbym to zrobić za pomocą magii danych.table i potrzebuję twojej pomocy :-). Myślę, że to, co jest potrzebne, to pewnego rodzaju sprzężenie własne pod warunkiem, że różnica wartości t jest mniejsza niż próg.
Kontynuacja: Mam kontynuacji pytanie: W mojej aplikacji tego sprzężenia odbywa się w kółko. Zmiana v, ale t's i n są zawsze takie same. Zastanawiam się więc, w jaki sposób przechowywać, które wiersze należą do siebie. Jakieś pomysły, jak to zrobić w sprytny sposób?
z twojego wyjścia, wygląda na to, że masz też warunek "i! = X", czy to prawda? –
Nie. Dla wiersza 9 foo = 0, ponieważ pojęcie abs (t-DT [i] $ t) == 0. Ale i! = X nie powinno być wykluczone, ponieważ obliczenia w mojej aplikacji są nieco bardziej skomplikowane, jak w tym przykładzie i potrzebuję tam wiersza x. – uuazed