Berechne zwischen Spalten in data.table oder dplyr?

8

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 .

    
Bigchao 15.01.2014, 04:28
quelle

4 Antworten

3

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%     
TheComeOnMan 15.01.2014, 05:01
quelle
7

Verkapseln Sie die Aufrufe von mean in der Liste und nicht den Mittelwert einer Liste, was Sie nicht tun können:

%Vor%

Um einen einzelnen Wert zu erhalten, den Mittelwert der Werte val1 und val2 , kombinieren Sie diese Werte und übergeben Sie diese an mean :

%Vor%

Eine Liste für das einzelne Element von j ist hier eine einfache Möglichkeit, die resultierende Spalte zu benennen.

    
Matthew Lundberg 15.01.2014 04:37
quelle
5
%Vor%

mean kann nur einen Vektor aufnehmen, es versteht keine Liste.

Ihre Frage lautete "Berechnen Sie den Mittelwert von val1 und val2 für jede ID." Aber basierend auf Mathews Antwort wollten Sie vielleicht "Berechne Mittel (Plural) von val1 und val2 für jede ID"?

    
JeremyS 15.01.2014 04:39
quelle
5

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.

Der Zweck dieses Beitrags ist es, den Leistungszuwachs darzustellen, den ein 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:

Abrufen von Daten:

%Vor%

Ohne Einstellschlüssel:

%Vor%

Durch Setzen der Taste:

%Vor%

Sie sehen, dass Sie mit der Taste ~ 8,4 Sekunden nehmen, wo ohne sie & gt; 40 Sekunden Das ist eine Menge Beschleunigung.

    
Arun 16.01.2014 23:57
quelle

Tags und Links