Schnell geschmolzene data.table-Operationen

8

Ich suche nach Mustern für die Manipulation von data.table -Objekten, deren Struktur der von Datenrahmen ähnelt, die mit melt aus dem reshape2 -Paket erstellt wurden. Ich beschäftige mich mit Datentabellen mit Millionen von Zeilen. Leistung ist kritisch.

Die verallgemeinerte Form der Frage ist, ob es eine Möglichkeit gibt, die Gruppierung basierend auf einer Teilmenge von Werten in einer Spalte durchzuführen und das Ergebnis der Gruppierungsoperation eine oder mehrere neue Spalten erzeugen zu lassen.

Eine spezifische Form der Frage könnte sein, wie man data.table benutzt, um das Äquivalent von dcast im folgenden zu erreichen:

%Vor%

dessen Ausgabe ist

%Vor%     
Sim 20.12.2012, 09:08
quelle

3 Antworten

8

Schnelle, ungetestete Antwort: Es scheint, als ob Sie by-without-by , a.k.a.. Gruppierung nach i :

suchen %Vor%

Das ist wie ein schnelles HAVING in SQL. j wird für jede Zeile von i ausgewertet. Mit anderen Worten, das obige ist das gleiche Ergebnis, aber viel schneller als:

%Vor%

Letzteres untergliedert und extrahiert für alle Gruppen (verschwenderisch), bevor nur die interessierenden Gruppen ausgewählt werden. Der erste ( by-without-by ) geht direkt zu der Untergruppe von Gruppen.

Die Gruppenergebnisse werden wie immer im langen Format zurückgegeben. Die anschließende Umformung auf die (relativ kleinen) aggregierten Daten sollte jedoch relativ zeitnah erfolgen. Das ist sowieso das Denken.

Der erste setkey(input,variable) könnte beißen, wenn input viele Spalten enthält, die nicht von Interesse sind. Wenn dies der Fall ist, kann es sinnvoll sein, die benötigten Spalten aufzuteilen:

%Vor%

Wenn in Zukunft sekundäre Schlüssel implementiert werden, wäre das einfacher:

%Vor%

Um auch nach id zu gruppieren:

%Vor%

und einschließlich id im Schlüssel können abhängig von Ihren Daten die Kosten von setkey wert sein:

%Vor%

Wenn Sie ein by-without-by mit by kombinieren, wie oben, dann funktioniert das by-without-by genauso wie eine Untermenge; d. h. j wird nur für jede Zeile von i ausgeführt, wenn by fehlt (daher der Name by-by-by ). Sie müssen also variable wieder in die by einfügen, wie oben gezeigt.

Alternativ sollte die folgende Gruppe nach id anstatt der Vereinigung von "x" und "y" gruppiert werden (aber das obige ist das, wonach Sie in der Frage gefragt haben, iiuc):

%Vor%     
Matt Dowle 20.12.2012, 10:13
quelle
3
%Vor%

Der letzte:

%Vor%     
42- 20.12.2012 09:17
quelle
2

Ich bin mir nicht sicher, ob das der beste Weg ist, aber Sie können es versuchen:

%Vor%     
A5C1D2H2I1M1N2O1R2T1 20.12.2012 09:34
quelle