Ich habe eine Liste von Datenrahmen, für die ich sicher bin, dass sie alle mindestens eine Zeile enthalten (tatsächlich enthalten einige nur eine Zeile und andere eine bestimmte Anzahl von Zeilen), und alle haben dieselben Spalten (Namen und Typen). Falls es darauf ankommt, bin ich mir auch sicher, dass es in den Reihen keine NA gibt.
Die Situation kann so simuliert werden:
%Vor%Ich habe die Parameter (der Randomisierung) so eingestellt, dass sie sich meiner wahren Situation annähern.
Nun möchte ich all diese Daten in einem Datenrahmen vereinen. Ich dachte, rbind würde den Trick machen, so:
%Vor%Nun, auf meinem System (was nicht besonders langsam ist) und mit den obigen Einstellungen ist dies die Ausgabe der system.time:
%Vor%Fast 6 Sekunden für 254 (in meinem Fall) Reihen von 200 Variablen? Sicherlich muss es einen Weg geben, die Leistung hier zu verbessern? In meinem Code muss ich sehr oft ähnliche Dinge tun (es ist eine multiple Imputation), also brauche ich das so schnell wie möglich.
Können Sie Ihre Matrizen nur mit numerischen Variablen erstellen und am Ende in einen Faktor umwandeln? rbind
ist in numerischen Matrizen viel schneller.
Auf meinem System unter Verwendung von Datenrahmen:
%Vor%Erstellen Sie stattdessen die Liste mit allen numerischen Matrizen:
%Vor% ergibt viel schneller rbind
.
EDIT: Hier ist eine andere Möglichkeit; es kombiniert nur jede Spalte der Reihe nach.
%Vor%Immer noch nicht annähernd so schnell wie die Verwendung von Matrizen.
EDIT 2:
Wenn Sie nur numerische Werte und Faktoren haben, ist es nicht so schwierig, alles in numerische Werte umzuwandeln, rbind
sie und die erforderlichen Spalten wieder in Faktoren umzuwandeln. Dies setzt voraus, dass alle Faktoren exakt dieselben Werte haben. Die Umwandlung in einen Faktor aus einer Ganzzahl ist auch schneller als von einer Zahl, so dass ich zuerst eine Ganzzahl erzwinge.
Das Timing auf meinem System ist:
%Vor% Kein großer Boost, aber das Tauschen von rbind
für rbind.fill
aus dem plyr
-Paket klopft ca. 10% der Laufzeit (mit dem Beispiel-Dataset auf meinem Rechner).
Wenn Sie Ihre data.frame
s wirklich schneller bearbeiten möchten, würde ich vorschlagen, das Paket data.table
und die Funktion rbindlist()
zu verwenden. Ich habe keine umfangreichen Tests durchgeführt, aber für meinen Datensatz (3000 Datenrahmen, 1000 Zeilen x 40 Spalten) benötigt rbindlist()
nur 20 Sekunden.
Das ist ~ 25% schneller, aber es muss einen besseren Weg geben ...
%Vor%Stellen Sie sicher, dass Sie den Datenrahmen an den Datenrahmen binden. Beim Binden der Liste an den Datenrahmen kam es zu einer enormen Leistungseinbuße.
Tags und Links r performance dataframe rbind