Ich habe Code, der an einer Stelle mit einer Liste von Datenrahmen endet, die ich wirklich in einen einzelnen großen Datenrahmen konvertieren möchte.
Ich habe einige Hinweise von einer früheren Frage erhalten, die versucht hat, etwas Ähnliches, aber Komplexeres zu tun.
Hier ist ein Beispiel dafür, womit ich beginne (dies ist zur Veranschaulichung stark vereinfacht):
listOfDataFrames <- vector(mode = "list", length = 100)
for (i in 1:100) {
listOfDataFrames[[i]] <- data.frame(a=sample(letters, 500, rep=T),
b=rnorm(500), c=rnorm(500))
}
Ich benutze derzeit Folgendes:
df <- do.call("rbind", listOfDataFrames)
do.call("rbind", list)
Redewendung habe ich auch schon früher verwendet. Warum brauchst du die Initialeunlist
?Antworten:
Verwenden Sie bind_rows () aus dem dplyr-Paket:
quelle
.id = "column_label"
Fügt die eindeutigen Zeilennamen basierend auf den Namen der Listenelemente hinzu.dplyr
sowohl schnell als auch ein solides Werkzeug ist, habe ich dies in die akzeptierte Antwort geändert. Die Jahre fliegen sie vorbei!Eine andere Möglichkeit ist die Verwendung einer Plyr-Funktion:
Dies ist etwas langsamer als das Original:
Ich vermute, dass mit
do.call("rbind", ...)
der schnellste Ansatz sein wird, den Sie finden werden, es sei denn, Sie können so etwas wie (a) eine Matrize anstelle eines data.frames verwenden und (b) die endgültige Matrix vorab zuweisen und ihr zuweisen, anstatt sie zu vergrößern .Bearbeiten 1 :
Basierend auf Hadleys Kommentar ist hier die neueste Version
rbind.fill
von CRAN:Dies ist einfacher als rbind und geringfügig schneller (diese Timings halten über mehrere Läufe hinweg). Und soweit ich das verstehe, ist die Version von
plyr
on github noch schneller.quelle
I()
könntedata.frame
in Ihremldply
Anruf ersetzenmelt.list
in Umform (2)do.call(function(...) rbind(..., make.row.names=F), df)
ist nützlich, wenn Sie die automatisch generierten eindeutigen Rownamen nicht möchten.Der Vollständigkeit halber dachte ich, dass die Antworten auf diese Frage ein Update erfordern. "Ich vermute, dass die Verwendung
do.call("rbind", ...)
der schnellste Ansatz sein wird, den Sie finden werden ..." Es war wahrscheinlich für Mai 2010 und einige Zeit danach zutreffend, aber im September 2011 wurde eine neue Funktionrbindlist
in derdata.table
Paketversion 1.8.2 eingeführt , mit der Bemerkung, dass "Dies das gleiche tutdo.call("rbind",l)
, aber viel schneller". Wie viel schneller?quelle
ldply
ein paar lange, geschmolzene Datenrahmen zu erstellen. Wie auch immer, ich habe durch Ihrenrbindlist
Vorschlag eine unglaubliche Beschleunigung erzielt .dplyr::rbind_all(listOfDataFrames)
wird auch den Trick machen.rbindlist
Gibt es ein Äquivalent zu, aber das Anhängen der Datenrahmen nach Spalte? so etwas wie eine cbindlist?do.call()
18 Stunden lang auf einer Liste von Datenrahmen lief und immer noch nicht fertig war, danke !!!Code:
Session:
UPDATE : Wiederholen Sie den 31. Januar 2018. Lief auf demselben Computer. Neue Versionen von Paketen. Samen für Samenliebhaber hinzugefügt.
UPDATE : Wiederholung 06-Aug-2019.
quelle
set.seed
), aber einige Unterschiede in der Worst-Case-Leistung festgestellt.rbindlist
hatte tatsächlich den besten Worst-Case sowie den besten typischen Fall in meinen ErgebnissenEs gibt auch
bind_rows(x, ...)
indplyr
.quelle
Hier ist eine andere Möglichkeit, dies zu tun (einfach zu den Antworten hinzufügen, weil
reduce
ein sehr effektives Funktionswerkzeug ist, das häufig als Ersatz für Schleifen übersehen wird. In diesem speziellen Fall ist keines dieser Tools wesentlich schneller als do.call).unter Verwendung der Basis R:
oder mit dem tidyverse:
quelle
Wie es im Tidyverse gemacht werden soll:
quelle
map
wennbind_rows
Sie eine Liste von Datenrahmen aufnehmen können?Ein aktualisiertes Bild für diejenigen, die einige der jüngsten Antworten vergleichen möchten (ich wollte die Lösung purrr mit dplyr vergleichen). Grundsätzlich habe ich Antworten von @TheVTM und @rmf kombiniert.
Code:
Sitzungsinfo:
Paketversionen:
quelle
Das einzige, was den Lösungen
data.table
fehlt, ist die Identifizierungsspalte, um zu wissen, von welchem Datenrahmen in der Liste die Daten stammen.Etwas wie das:
Der
idcol
Parameter fügt eine Spalte (.id
) hinzu, die den Ursprung des in der Liste enthaltenen Datenrahmens angibt. Das Ergebnis würde ungefähr so aussehen:quelle