Ist es möglich, zwei Datenrahmen, die nicht denselben Spaltensatz haben, zeilenweise zu binden? Ich hoffe, die Spalten beizubehalten, die nach dem Binden nicht übereinstimmen.
232
rbind.fill
aus dem Paket plyr
könnte sein, was Sie suchen.
rbind.fill
undbind_rows()
beide lassen lautlos Rownamen fallen.Eine neuere Lösung besteht darin,
dplyr
diebind_rows
Funktion zu verwenden , von der ich annehme, dass sie effizienter ist alssmartbind
.quelle
ABC
kann nicht von Zeichen in Zahlen umgewandelt werden. Gibt es eine Möglichkeit, die Spalten zuerst zu konvertieren?Sie können
smartbind
aus demgtools
Paket verwenden.Beispiel:
quelle
smartbind
mit zwei großen Datenrahmen (insgesamt ungefähr 3 * 10 ^ 6 Zeilen) versucht und nach 10 Minuten abgebrochen.Wenn die Spalten in df1 eine Teilmenge der Spalten in df2 sind (nach Spaltennamen):
quelle
Eine Alternative mit
data.table
:rbind
funktioniertdata.table
auch, solange die Objekte indata.table
Objekte konvertiert werdenwird auch in dieser Situation funktionieren. Dies kann vorzuziehen sein, wenn Sie über mehrere data.tables verfügen und keine Liste erstellen möchten.
quelle
intersect
Ansatz, funktionieren nur für 2 Datenrahmen und lassen sich nicht leicht verallgemeinern.Die meisten Antworten der Basis R befassen sich mit der Situation, in der nur ein data.frame zusätzliche Spalten enthält oder der resultierende data.frame den Schnittpunkt der Spalten aufweist. Da das OP schreibt, hoffe ich, die Spalten beizubehalten, die nach dem Binden nicht übereinstimmen , ist eine Antwort mit Basis-R-Methoden zur Behebung dieses Problems wahrscheinlich eine Veröffentlichung wert.
Im Folgenden stelle ich zwei Basis-R-Methoden vor: Eine, die die ursprünglichen data.frames ändert, und eine, die dies nicht tut. Zusätzlich biete ich eine Methode an, die die zerstörungsfreie Methode auf mehr als zwei data.frames verallgemeinert.
Lassen Sie uns zunächst einige Beispieldaten abrufen.
Zwei Datenrahmen, Originale ändern
Um alle Spalten aus beiden Datenrahmen in einem zu behalten
rbind
(und die Funktion ohne Fehler arbeiten zu lassen), fügen Sie jedem Datenrahmen NA-Spalten mit den entsprechenden fehlenden Namen hinzu mitsetdiff
.Nun,
rbind
-emBeachten Sie, dass die ersten beiden Zeilen die ursprünglichen Datenrahmen df1 und df2 ändern und beiden den vollständigen Satz von Spalten hinzufügen.
Zwei data.frames, Originale nicht ändern
Um die ursprünglichen data.frames intakt zu lassen, durchlaufen Sie zunächst die unterschiedlichen Namen und geben Sie einen benannten Vektor von NAs zurück, die mit dem data.frame in einer Liste verkettet sind
c
. Danndata.frame
wandelt das Ergebnis in eine entsprechende data.frame für dierbind
.Viele data.frames ändern Originale nicht
In dem Fall, dass Sie mehr als zwei data.frames haben, können Sie Folgendes tun.
Vielleicht ein bisschen schöner, die Zeilennamen der ursprünglichen data.frames nicht zu sehen? Dann mach das.
quelle
mydflist <- list(as, dr, kr, hyt, ed1, of)
. Dadurch sollte ein Listenobjekt erstellt werden, das nicht die Größe Ihrer Umgebung vergrößert, sondern nur auf jedes Element der Liste verweist (sofern Sie anschließend keinen Inhalt ändern). Entfernen Sie nach dem Vorgang das Listenobjekt, um die Sicherheit zu gewährleisten.Sie können auch einfach die allgemeinen Spaltennamen herausziehen.
quelle
Ich habe eine Funktion geschrieben, um dies zu tun, weil ich möchte, dass mein Code mir sagt, wenn etwas nicht stimmt. Diese Funktion teilt Ihnen explizit mit, welche Spaltennamen nicht übereinstimmen und ob der Typ nicht übereinstimmt. Dann wird es sein Bestes tun, um die data.frames trotzdem zu kombinieren. Die Einschränkung besteht darin, dass Sie jeweils nur zwei data.frames kombinieren können.
quelle
Vielleicht habe ich Ihre Frage völlig falsch verstanden, aber das "Ich hoffe, die Spalten beizubehalten, die nach dem Binden nicht übereinstimmen" lässt mich denken, dass Sie nach einer
left join
oder einerright join
ähnlichen SQL-Abfrage suchen . R verfügt über diemerge
Funktion, mit der Sie linke, rechte oder innere Verknüpfungen angeben können, ähnlich wie beim Verknüpfen von Tabellen in SQL.Zu diesem Thema gibt es hier bereits eine gute Frage und Antwort: Wie werden Datenrahmen (innen, außen, links, rechts) verbunden (zusammengeführt)?
quelle
gtools / smartbind arbeiteten nicht gern mit Dates, wahrscheinlich weil es as.vectoring war. Also hier ist meine Lösung ...
quelle
Nur zur Dokumentation. Sie können die
Stack
Bibliothek und ihre FunktionStack
in folgender Form ausprobieren :Ich habe auch den Eindruck, dass es schneller als andere Methoden für große Datenmengen ist.
quelle
Sie können auch verwendet werden
sjmisc::add_rows()
, welche Anwendungendplyr::bind_rows()
, aber im Gegensatz zubind_rows()
,add_rows()
Konserven - Attribute und ist daher für sinnvoll markierte Daten .Siehe folgendes Beispiel mit einem beschrifteten Datensatz. Die Funktion
frq()
druckt Häufigkeitstabellen mit Wertelabels, wenn die Daten beschriftet sind.quelle
quelle