Effizientes Suchen nach Gruppen in einer einzelnen R data.table
Ich habe eine große, breitedata.table
(20 m Zeilen) mit einer Personen-ID, aber mit vielen Spalten (~ 150), die viele Nullwerte enthalten. Jede Spalte ist ein aufgezeichneter Zustand / Attribut, das ich für jede Person vortragen möchte. Jede Person kann zwischen 10 und 10.000 Beobachtungen durchführen und es befinden sich ungefähr 500.000 Personen im Set. Werte von einer Person können nicht in die folgende Person übergehen, daher muss meine Lösung die Spalte und Gruppe der Personen-ID angemessen berücksichtigen.
Zu Demonstrationszwecken - hier ist eine sehr kleine Beispieleingabe:
DT = data.table(
id=c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3),
aa=c("A", NA, "B", "C", NA, NA, "D", "E", "F", NA, NA, NA),
bb=c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
cc=c(1, NA, NA, NA, NA, 4, NA, 5, 6, NA, 7, NA)
)
Es sieht aus wie das
id aa bb cc
1: 1 A NA 1
2: 1 NA NA NA
3: 1 B NA NA
4: 1 C NA NA
5: 2 NA NA NA
6: 2 NA NA 4
7: 2 D NA NA
8: 2 E NA 5
9: 3 F NA 6
10: 3 NA NA NA
11: 3 NA NA 7
12: 3 NA NA NA
Meine erwartete Ausgabe sieht folgendermaßen aus:
id aa bb cc
1: 1 A NA 1
2: 1 A NA 1
3: 1 B NA 1
4: 1 C NA 1
5: 2 NA NA NA
6: 2 NA NA 4
7: 2 D NA 4
8: 2 E NA 5
9: 3 F NA 6
10: 3 F NA 6
11: 3 F NA 7
12: 3 F NA 7
Ich habe ein @ gefunddata.table
Lösung, die funktioniert, aber bei meinen großen Datenmengen ist sie furchtbar langsam:
DT[, na.locf(.SD, na.rm=FALSE), by=id]
Ich habe mit dplyr äquivalente Lösungen gefunden, die ebenso langsam sind.
GRP = DT %>% group_by(id)
data.table(GRP %>% mutate_each(funs(blah=na.locf(., na.rm=FALSE))))
Ich hatte die Hoffnung, dass ich mit dem @ einen rollenden 'Selbst'-Join erstellen konntdata.table
-Funktionalität, aber ich scheine es einfach nicht richtig zu machen (ich vermute, ich müsste @ verwend.N
aber ich habe es gerade nicht herausgefunden).
An diesem Punkt denke ich, dass ich etwas in Rcpp schreiben muss, um die gruppierte locf effizient anzuwenden.
Ich bin neu in R, aber ich bin nicht neu in C ++ - also bin ich zuversichtlich, dass ich es schaffen kann. Ich habe nur das Gefühl, dass es eine effiziente Möglichkeit geben sollte, dies in R mit @ zu tudata.table
.