HOWTO · R
Zwei Dataframe in R zusammenführen
Dieses Tutorial zeigt, wie Sie zwei Data Frames in R mit rbind(), dplyr::bind_rows(), plyr::join() oder merge() kombinieren. Welche Methode passt, hängt davon ab, ob Sie Zeilen anhängen oder Datensätze über Schlüssel verbinden. Bei größeren Datenmengen sollten Sie repräsentative Eingaben messen.
Auf dieser Seite
Um zwei Data Frames in R zu kombinieren, entscheiden Sie zunächst, ob Sie Datensätze aneinanderhängen oder zusammengehörige Datensätze einander zuordnen möchten. Verwenden Sie rbind(), wenn beide Eingaben dieselbe Art von Datensätzen und kompatible Spalten enthalten. dplyr::bind_rows() eignet sich, wenn beim Aneinanderhängen auch Spalten vorkommen dürfen, die nur in einer der Eingaben vorhanden sind. Verwenden Sie plyr::join() oder merge() aus Base R, wenn Zeilen anhand eines Schlüssels wie einer ID einander zugeordnet werden sollen. Die folgenden Beispiele verwenden kleine Tabellen, deren Spaltennamen und Werte Sie an Ihre Daten anpassen können.
Zwei Data Frames in R mit der Funktion rbind() kombinieren
rbind() aus Base R hängt die Zeilen eines Data Frames an die eines anderen an. Die Eingaben sollten dieselben Spalten mit übereinstimmenden Namen und kompatiblen Werten enthalten. Übereinstimmende Namen sind wichtiger als die Spaltenreihenfolge: rbind() richtet die Spalten anhand ihrer Namen aus, sodass die Werte unter den richtigen Überschriften bleiben. Die Funktion bildet weder eine Vereinigung unterschiedlich benannter Spalten noch füllt sie fehlende Felder für Sie auf. Wenn die Eingaben unterschiedliche Felder enthalten, bringen Sie ihre Struktur zunächst in eine einheitliche Form oder verwenden Sie bind_rows().
Dieses Beispiel erstellt zwei Tabellen mit derselben Struktur und hängt ihre Datensätze dann mit rbind() aneinander:
x <- data.frame(
id = c(1, 2),
score = c(88, 91)
)
y <- data.frame(
id = c(3, 4),
score = c(85, 96)
)
combined <- rbind(x, y)
print(combined)
id score
1 1 88
2 2 91
3 3 85
4 4 96
Jede Ergebniszeile ist eine weitere Beobachtung derselben Variablen. Die Zeilen der ersten Tabelle stehen weiterhin zuerst, gefolgt von den Zeilen der zweiten Tabelle. Bei Data Frames mit unterschiedlichen Feldern können Sie bind_rows() verwenden, damit fehlende Werte als NA dargestellt werden.
Zwei Data Frames in R mit dem Paket dplyr kombinieren
Das Paket dplyr stellt bind_rows() bereit, um Datensätze aus Data Frames mit unterschiedlichen Spalten aneinanderzuhängen. Die Funktion ordnet Spalten anhand ihrer Namen zu und berücksichtigt alle Spalten, die in mindestens einer der Eingaben vorkommen. Fehlt einer Zeile ein Wert für eine Spalte, erhält sie NA. Das ist nützlich, wenn zwei Quellen dieselbe Art von Datensätzen beschreiben, aber eine Quelle ein zusätzliches Feld enthält. Es handelt sich weiterhin um ein Aneinanderhängen von Zeilen; Datensätze werden dabei nicht anhand einer ID einander zugeordnet.
Installieren Sie dplyr mit install.packages("dplyr"), um dplyr::bind_rows() in Ihrem eigenen Skript zu verwenden. Das Beispiel bevorzugt diese Funktion, wenn das Paket installiert ist. Andernfalls richtet eine kleine Base-R-Ausweichlösung die gleichnamigen Spalten aus und füllt fehlende Werte mit NA, sodass das Beispiel ohne zusätzliches Paket ausgeführt werden kann.
first <- data.frame(id = 1, score = 88)
second <- data.frame(id = 2, group = "B")
if (requireNamespace("dplyr", quietly = TRUE)) {
combined <- dplyr::bind_rows(first, second)
} else {
columns <- union(names(first), names(second))
align_columns <- function(data) {
for (column in setdiff(columns, names(data))) data[[column]] <- NA
data[columns]
}
combined <- rbind(align_columns(first), align_columns(second))
}
cat("id score group\n")
for (i in seq_len(nrow(combined))) {
score <- if (is.na(combined$score[i])) "NA" else as.character(combined$score[i])
group <- if (is.na(combined$group[i])) "NA" else combined$group[i]
cat(paste(combined$id[i], score, group), "\n", sep = "")
}
id score group
1 88 NA
2 NA B
Zwei Data Frames in R mit dem Paket plyr kombinieren
join() aus dem Paket plyr verbindet zusammengehörige Zeilen anhand von Schlüsselspalten. Es handelt sich um einen Join und nicht um ein Aneinanderhängen von Zeilen. Legen Sie den gemeinsamen Schlüssel mit by fest. Bei type = "inner" enthält das Ergebnis nur Schlüssel, die in beiden Eingaben vorkommen; der Standardwert type = "left" behält alle Zeilen der ersten Eingabe bei. Installieren Sie plyr mit install.packages("plyr"), um plyr::join() in Ihrem eigenen Skript zu verwenden. Das Beispiel bevorzugt diese Funktion, sofern sie verfügbar ist, und verwendet andernfalls merge() aus Base R für dasselbe Inner-Join-Ergebnis. Wenn Sie einen anderen Join-Typ wählen möchten, lesen Sie die Hilfe zum installierten Paket mit ?plyr::join auf.
people <- data.frame(id = c(1, 2), name = c("Ada", "Ben"))
ages <- data.frame(id = c(2, 3), age = c(25, 30))
if (requireNamespace("plyr", quietly = TRUE)) {
matched <- plyr::join(people, ages, by = "id", type = "inner")
} else {
matched <- merge(people, ages, by = "id")
}
cat("id name age\n")
for (i in seq_len(nrow(matched))) {
cat(paste(matched$id[i], matched$name[i], matched$age[i]), "\n", sep = "")
}
id name age
2 Ben 25
Zwei Data Frames in R mit der Funktion merge() kombinieren
merge() aus Base R verbindet Data Frames, indem die Werte in Schlüsselspalten abgeglichen werden. Verwenden beide Eingaben eine gleichnamige Spalte, gibt by diesen Schlüssel an. Standardmäßig behält merge() nur Schlüssel, die in beiden Eingaben vorkommen; das entspricht einem Inner Join. Setzen Sie all.x = TRUE, um alle Zeilen aus x zu behalten, all.y = TRUE, um alle Zeilen aus y zu behalten, oder beide Optionen, um auch nicht zugeordnete Zeilen beider Seiten einzubeziehen. Achten Sie auf kompatible Typen der Schlüsselspalten und darauf, dass doppelte Schlüssel beabsichtigt sind: Mehrere Treffer können zu mehreren Ergebniszeilen führen.
Dieses eigenständige Beispiel verbindet zwei Tabellen anhand von id und gibt die übereinstimmenden Datensätze aus:
people <- data.frame(
id = c(1, 2, 3),
name = c("Ada", "Ben", "Cy")
)
ages <- data.frame(
id = c(2, 3, 4),
age = c(25, 30, 35)
)
matched <- merge(people, ages, by = "id")
print(matched)
id name age
1 2 Ben 25
2 3 Cy 30
Verwenden Sie merge(people, ages, by = "id", all.x = TRUE), wenn das Ergebnis jede Person enthalten soll, auch wenn kein passendes Alter vorhanden ist. Bei einem Merge in der Standardeinstellung wird die Ausgabe nach dem Schlüssel sortiert, sofern Sie nicht sort = FALSE angeben. Die oben gezeigte Tabelle ist die für dieses Beispiel bereitgestellte beobachtete Ausgabe.
Fazit
Verwenden Sie rbind(), um Zeilen mit gemeinsamer Struktur anzuhängen. dplyr::bind_rows() eignet sich, wenn Sie Eingaben mit unterschiedlichen Spalten aneinanderhängen und fehlende Zellen mit NA auffüllen möchten. Mit plyr::join() oder merge() lassen sich zusammengehörige Datensätze anhand von Schlüsseln einander zuordnen. merge() aus Base R ist ohne zusätzliches Paket verfügbar und bietet Optionen, um nicht zugeordnete Zeilen beizubehalten. Prüfen Sie vor dem Kombinieren größerer Datenmengen, ob die Schlüssel eindeutig sind, welche Typen die Spalten haben und ob Sie Zeilen anhängen oder einen Join ausführen. Die Leistung hängt von den Daten und der Umgebung ab. Messen Sie deshalb repräsentative Eingaben, bevor Sie eine Geschwindigkeitsbehauptung übernehmen oder eine eigene Optimierung einsetzen.