Ich möchte data.table
verwenden, um eine sehr einfache Aufgabe für einen großen Datensatz zu erreichen.
Berechne den Mittelwert von val1 und val2 für jede ID.
Details finden Sie in den angehängten gefälschten Daten.
%Vor%Hier möchte ich für jede ID den Mittelwert von val1 und val2 berechnen.
Beachten Sie auch, dass es in jeder ID unterschiedliche Ebenen gibt. Aber für jede eindeutige ID möchte ich nur ein Mittel verwenden, das die verschiedenen Ebenen val1 und val2 enthält.
--- ID | Mittel ---
- ID1 | ...
- ID2 | ...
- ID3 | ...
Ich habe den folgenden Code ausprobiert, aber es funktioniert nicht.
%Vor% aber es funktioniert nicht.
Ich weiß, wie man es macht in reshape2
, zuerst melt
und dann dcast
.
Aber das ursprüngliche Dataset ist relativ groß mit 20 Millionen Zeilen und 12 Feldern, es dauert ziemlich lange, die Berechnung durchzuführen.
Also bevorzuge ich data.table
oder dplyr
.
Wenn ich richtig verstanden habe, haben Sie zwölf Felder und möchten die Kodierung auf ein Minimum beschränken. Ich bin nicht ganz sicher, was Ihre beabsichtigte Ausgabe ist, aber hoffentlich ist es eins der zwei Ergebnisse unten -
%Vor%Option 1, Mittelwert der einzelnen Variablenwerte innerhalb dieser ID
%Vor%Ausgabe -
%Vor%Option 2, Mittelwert aller Variablenwerte innerhalb dieser ID
%Vor%Ausgabe
%Vor% Verkapseln Sie die Aufrufe von mean
in der Liste und nicht den Mittelwert einer Liste, was Sie nicht tun können:
Um einen einzelnen Wert zu erhalten, den Mittelwert der Werte val1
und val2
, kombinieren Sie diese Werte und übergeben Sie diese an mean
:
Eine Liste für das einzelne Element von j
ist hier eine einfache Möglichkeit, die resultierende Spalte zu benennen.
Sie erwähnen, dass Ihre Datenbemaßungen aus 20 Millionen Zeilen mit 12 Spalten bestehen, erwähnen jedoch nicht die Anzahl der eindeutigen Werte von "ID". Ich gehe hier von 20.000 aus.
Wenn Sie nach einer Lösung suchen, die sowohl 1) schnell und 2) memory-effizient ist, dann würde die Lösung von Matthew (oder Jeremy) alle Variablen buchstabieren besser funktionieren - das heißt , bis unlist(.SD)
optimiert ist. Was am besten wäre, ist @ codoremifa's Syntax mit der Leistung von @ Matthew.
setkey
auf dem data.table
(von solch riesigen Dimensionen) haben könnte, bevor er aggregiert wird (dessen Aspekt nicht durch die Antworten im Zeitpunkt des Schreibens). setkey
wird normalerweise verwendet, weil es für join
oder fast subset
(basierend auf binärer Suche ) erforderlich ist. Aber auf Datendimensionen wie Ihrer (das ist sicher gesagt, BIG-Daten), können Sie viel nutzen, indem Sie den Schlüssel einstellen. Dies liegt daran, dass setkey
die Daten nach Ihrer Schlüsselspalte sortiert. Dadurch können Spalten aggregiert werden, wenn sie später an zusammenhängenden Speicherorten liegen und daher sehr effizient sind.
Es gibt viele Verbesserungen in v1.8.11 (die aktuelle Entwicklungsversion, in der setkey
hat auch viel schneller bekommen). Die hier gezeigten Benchmarks variieren daher mit der aktuellen stabilen Version 1.8.10 auf CRAN . Es ist in Ordnung, wenn Sie keine Entwicklungsversion verwenden. Hoffentlich wird dies Sie von der Nützlichkeit von setkey
überzeugen und Ihnen einige Dinge darüber geben, was Sie in der nächsten Version erwarten können.
Okay, weiter zur Veranschaulichung der Daten Ihrer Dimensionen:
Sie sehen, dass Sie mit der Taste ~ 8,4 Sekunden nehmen, wo ohne sie & gt; 40 Sekunden Das ist eine Menge Beschleunigung.
Tags und Links r data.table dplyr