In der Praxis liegen Daten oft auf verschiedenen Servern und in vielen Dateien. Wenn die benötigten Daten aus mehreren Quellen stammen, musst du wissen, wie du sie so zusammenführst, dass möglichst wenig Information verloren geht und die Zuordnungen zur Struktur deiner Daten passen.
Dieses Tutorial zeigt dir:
- Horizontales und vertikales Zusammenführen von Datasets
- Was Primärschlüssel sind und wie sie deinen Daten Struktur geben
- Verschiedene Join-Typen (z. B. Left Join, Inner Join, Full Join) und wie du den passenden auswählst
- Ein häufiges Problem, auf das du achten solltest, und wie du es löst
Datasets verketten
Grundsätzlich gibt es zwei Wege, Datasets zu mergen: Du fügst deinem Datensatz entweder weitere Zeilen oder weitere Spalten hinzu. Wenn Datasets dieselben Spalten haben oder dieselben Beobachtungen enthalten, kannst du sie entsprechend vertikal oder horizontal verketten. Schauen wir uns Beispiele an.
Datasets vertikal hinzufügen
Wenn mehrere Datasets denselben Satz an Spalten haben, kannst du sie vertikal aneinanderhängen. Das heißt, du behältst die Spalten und fügst weitere Zeilen hinzu. Alles in einer Datei zu haben, macht das Aggregieren einfacher und du behältst den Überblick, ohne ständig zwischen Dateien zu wechseln.
Dataset 1
| Make | Num models |
|---|---|
| Honda | 63 |
| BMW | 10 |
Dataset 2
| Make | Num models |
|---|---|
| Ford | 26 |
| Tesla | 4 |
Wichtig: Wenn dieselbe Beobachtung in mehreren Datasets vorkommt und du sie mit rbind() vertikal verkettest, erhältst du Duplikate. Und obwohl beide Datasets dieselben Variablen (also Spalten) haben müssen, müssen sie nicht in derselben Reihenfolge stehen. Probier es in der Konsole unten aus!
In deinem Workspace liegen die beiden Datasets dataset1 und dataset2 wie oben gezeigt. Versuch, die Spalten von dataset1 umzusortieren. Rufe rbind() sowohl auf dataset1 und dataset2 als auch auf reordered_dataset1 und dataset2 auf.
dataset1 <- data.frame(make = c("Honda", "BMW"),
num_models = c(63, 10))
dataset2 <- data.frame(make = c("Ford", "Tesla"),
num_models = c(26, 4))
# Add datasets vertically
rbind(dataset1, dataset2)
# Reorder columns
reordered_dataset1 <- dataset1[, c(2, 1)]
# See that rbind() is robust to column ordering
rbind(reordered_dataset1, dataset2)
Nach rbind() solltest du alle vier Automarken in einer Tabelle sehen, etwa so:
Vertikal verkettetes Dataset
| Make | Num models |
|---|---|
| Honda | 63 |
| BMW | 10 |
| Ford | 26 |
| Tesla | 4 |
Lerne R kostenlos
R für Fortgeschrittene
Datasets horizontal hinzufügen
Wenn Datasets denselben Satz an Beobachtungen repräsentieren, kannst du sie horizontal verketten. Diesmal behältst du die Zeilen und fügst weitere Spalten hinzu. In solchen Fällen solltest du prüfen, dass die Reihenfolge der Beobachtungen übereinstimmt. Haben die Datasets unterschiedlich viele Zeilen oder zwar gleich viele, aber in unterschiedlicher Reihenfolge, können Spalten falsch zugeordnet werden.
Erweitern wir das obige Beispiel. Angenommen, du hast zwei Dateien: eine mit Automarke und Anzahl einzigartiger Modelle und eine weitere mit Automarke und Gesamtverkäufen:
Anzahl einzigartiger Modelle
| Make | Num models |
|---|---|
| Honda | 63 |
| BMW | 10 |
| Ford | 26 |
| Tesla | 4 |
Gesamtverkäufe
| Make | Sales |
|---|---|
| Ford | 119157 |
| BMW | 25908 |
| Honda | 188328 |
| Tesla | 29975 |
Wichtig: Wenn dieselbe Beobachtung in mehreren Datasets vorkommt und du sie mit cbind() horizontal verkettest, erhältst du redundante Spalten. Und obwohl die beiden Datasets inhaltlich zusammengehören, ist die Zeilenreihenfolge entscheidend!
Rufe in der Konsole unten cbind() auf models und sales auf und gib das Ergebnis aus:
models <- data.frame(make = c("Honda", "BMW", "Ford", "Tesla"),
num_models = c(63, 10, 26, 4))
sales <- data.frame(make = c("Ford", "BMW", "Honda", "Tesla"),
sales = c(119157, 25908, 188328, 29975))
# Add datasets horizontally
cbind(models, sales)
Du solltest etwas in dieser Art erhalten:
Models & Sales
| Make | Num models | Make | Sales |
|---|---|---|---|
| Honda | 63 | Ford | 119157 |
| BMW | 10 | BMW | 25908 |
| Ford | 26 | Honda | 188328 |
| Tesla | 4 | Tesla | 29975 |
Siehst du das Problem? Diese Daten sind nicht tidy!
Nach den Prinzipien von Tidy Data aus diesem Grundlagenkurs sollte jede Beobachtung in genau einer Zeile stehen. Und was, wenn du in einem Dataset nur für einige Zeilen zusätzliche Informationen hast und nur diese ergänzen möchtest? Anders gesagt: Was, wenn du weitere Spalten aus einem Dataset hinzufügen möchtest, die Datasets aber nicht dieselbe Anzahl an Beobachtungen haben?
Primärschlüssel und Fremdschlüssel
Der erste Schritt beim Kombinieren von Datasets ist die Suche nach dem Primärschlüssel. Der Primärschlüssel ist die Spalte oder Kombination von Spalten, die jede Beobachtung eindeutig identifiziert. Im Beispiel mit Automarken, der Anzahl einzigartiger Modelle und den Gesamtverkäufen ist der Primärschlüssel die Spalte make.
Jetzt können wir Joins nutzen, die Standardmethode, um Datasets zu einer Tabelle zu verbinden.
Join-Typen
Es gibt viele Join-Arten. Wie du Spalten aus einem Dataset mit Spalten eines anderen per Mutating Joins ergänzt, wie du ein Dataset per Filtering Joins gegen ein anderes filterst und wie du mit Mengenoperationen arbeitest, lernst du im Kurs Joining Data in R with dplyr. Hier sind einige der gängigsten:
left_join(x, y): Gibt alle Zeilen aus x und alle Spalten aus x und y zurück. Zeilen in x ohne Treffer in y erhalten in den neuen Spalten NA. Bei mehreren Treffern zwischen x und y werden alle Kombinationen zurückgegeben.
inner_join(x, y): Gibt alle Zeilen aus x mit passenden Werten in y sowie alle Spalten aus x und y zurück. Bei mehreren Treffern zwischen x und y werden alle Kombinationen zurückgegeben.
full_join(x, y): Gibt alle Zeilen und alle Spalten aus x und y zurück. Wo es keine passenden Werte gibt, steht NA für das fehlende Element.
Die genannten Joins sind Beispiele für Mutating Joins, da sie Variablen aus zwei Datasets kombinieren.
Fehlende Keys
Angenommen, du hast zwei Datasets. Das erste heißt size und enthält Personennamen und ihre T-Shirt-Größe:
> size
name size
1 Tom M
2 Dan XL
3 Keil S
Das zweite Dataset heißt color und enthält Nachnamen, bevorzugte T-Shirt-Farben und speichert einige Informationen im Attribut row.names:
> color
surname color
Tom Jeon <NA>
Dan Smith Dark
Bob McLadden Light
Merkst du, was hier schiefgehen kann? Joins über zwei Tabellen werden kompliziert, wenn Keys fehlen oder doppelt vorkommen. In diesem Beispiel speichern R-Data-Frames wichtige Informationen im Attribut row.names. In so einem Fall kannst du den Key mit Join-Funktionen nicht ansprechen, weil diese nur auf Spalten des Data Frames zugreifen.
Der einfache Trick zur Lösung ist die Funktion rownames_to_column() aus dem Paket tibble. Sie gibt eine Kopie deines Datasets zurück und fügt die Zeilennamen als eigene Spalte hinzu. Das erste Argument von rownames_to_column() ist dein Data-Frame-Objekt, das zweite ein String mit dem Namen der hinzuzufügenden Spalte.
Probier es unten in der Konsole aus. Die Datasets size und color sind in deinem Workspace vorab geladen.
color <- data.frame(surname = c("Jeon", "Smith", "McLadden"), color = c(NA, "Dark", "Light"))
row.names(color) <- c("Tom", "Dan", "Bob")
size <- data.frame(name = c("Tom", "Dan", "Keil"), size = c("M", "XL", "S"))
# Explore here!
Zum Schluss
In der realen Welt sind Daten oft über viele Datasets und Formate verteilt. Da R für die Arbeit mit einzelnen Tabellen ausgelegt ist, gehört das Aufbereiten und Zusammenführen zu einer einzigen Tabelle zu den Kernkompetenzen. Absolviere den Skill Track Importing & Cleaning Data with R und lerne, Daten in jedem Format zu parsen und zu kombinieren. Sieh dir auch DataCamps Tutorial R Data Import an. Viel Erfolg beim Lernen!