Wie kommt man zu aggregieren und zusammenfassen von Daten schnell?
Ich habe einen Datensatz, dessen Header ungefähr so Aussehen:
PID Time Site Rep Count
Möchte ich die Summe der Count
durch Rep
für jeden PID x Time x Site combo
auf die resultierenden Daten.Rahmen, ich möchte den Mittelwert von Count
für PID x Time x Site
combo.
Aktuelle Funktion ist wie folgt:
dummy <- function (data)
{
A<-aggregate(Count~PID+Time+Site+Rep,data=data,function(x){sum(na.omit(x))})
B<-aggregate(Count~PID+Time+Site,data=A,mean)
return (B)
}
Dies ist quälend langsam (original-Daten.Rahmen ist 510000 20)
. Gibt es eine Möglichkeit, diese Fahrt mit plyr?
- Sie nicht Zustand, warum haben Sie das A< - - Linie. Sind Sie sicher, dass es eine Gewichtung gibt es? Entsprechend Ihrer angegebenen Kriterium müssen Sie nur die B< - - Linie. (plyr nicht machen es nicht schneller, aber die Daten.Rahmen)
- Recht, Daten.Tisch war super schnell (und ich bin so froh, dass ich gelernt, über es). Einer war überflüssig, ja.
- Dann die Eine Linie würde erklären, warum das Aggregat wurde so langsam. Wenn Sie gerade in Ausführung B sollte es gehen ziemlich schnell. Die Daten.Tabelle bereitgestellten Befehl auch entfernt REP. Es ist, dass Sie quasi einen neuen data frame in A die gleiche Größe wie das original, dass war eine Verlangsamung Dinge nach unten, so viel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie sich das Paket
data.table
für eine schnellere aggregation Operationen an großen Daten-frames. Für dein problem, die Lösung würde wie folgt Aussehen:PID
,Time
undSite
(genau so, Aggregat funktioniert)?keyby
stattby
Lassen Sie uns sehen, wie schnell
data.table
ist und vergleichen Sie mitdplyr
. Thishis wäre ungefähr der Weg, es zu tun indplyr
.Oder vielleicht, je nach genau, wie die Frage interpretiert wird:
Hier ist ein vollständiges Beispiel für diese alternativen gegenüber @Ramnath vorgeschlagene Antwort und die eine @David Arenburg vorgeschlagen, in den Kommentaren , die ich denke, ist äquivalent zu der zweiten
dplyr
- Anweisung.Den Daten-Tisch-Methode ist viel schneller, und die
setDT
ist noch schneller!setDT(data)[,.(A = sum(Count), B = mean(Count)), by = 'PID,Time,Site']
statt erstellen einer Kopie