library(dplyr)
library(palmerpenguins)
data("penguins")
Zwei Data Frames kombinieren
Spalten und Reihen zusammenführen:
Der Inhalt von zwei Data Frames soll zu einem Data Frame zusammengefügt werden.
Wir nutzen den penguins-Datensatz aus dem
palmerpenguins
Paket:
Spalten aneinander reihen
- Hier erstellen wir zwei Datensätze durch Auswahl von Spaltenindizes:
<- penguins |>
pinguSpalten1 select(1:4)
head(pinguSpalten1)
# A tibble: 6 × 4
species island bill_length_mm bill_depth_mm
<fct> <fct> <dbl> <dbl>
1 Adelie Torgersen 39.1 18.7
2 Adelie Torgersen 39.5 17.4
3 Adelie Torgersen 40.3 18
4 Adelie Torgersen NA NA
5 Adelie Torgersen 36.7 19.3
6 Adelie Torgersen 39.3 20.6
<- penguins |>
pinguSpalten2 select(5:8)
head(pinguSpalten2)
# A tibble: 6 × 4
flipper_length_mm body_mass_g sex year
<int> <int> <fct> <int>
1 181 3750 male 2007
2 186 3800 female 2007
3 195 3250 female 2007
4 NA NA <NA> 2007
5 193 3450 female 2007
6 190 3650 male 2007
- Um die Spalten wieder zusammenzuführen, können wir die Funktion
cbind()
aus demdplyr
Paket verwenden:
<- cbind(pinguSpalten1, pinguSpalten2)
alleSpalten.pinguine head(alleSpalten.pinguine)
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
1 Adelie Torgersen 39.1 18.7 181 3750
2 Adelie Torgersen 39.5 17.4 186 3800
3 Adelie Torgersen 40.3 18.0 195 3250
4 Adelie Torgersen NA NA NA NA
5 Adelie Torgersen 36.7 19.3 193 3450
6 Adelie Torgersen 39.3 20.6 190 3650
sex year
1 male 2007
2 female 2007
3 female 2007
4 <NA> 2007
5 female 2007
6 male 2007
Reihen zusammenfügen
- Wir erstellen zwei Datensätze, indem wir List expressions verwenden:
<- penguins[c(1:4), ]
pinguReihen1 pinguReihen1
# A tibble: 4 × 8
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
<fct> <fct> <dbl> <dbl> <int> <int>
1 Adelie Torgersen 39.1 18.7 181 3750
2 Adelie Torgersen 39.5 17.4 186 3800
3 Adelie Torgersen 40.3 18 195 3250
4 Adelie Torgersen NA NA NA NA
# ℹ 2 more variables: sex <fct>, year <int>
<- penguins[c(5:8), ]
pinguReihen2 pinguReihen2
# A tibble: 4 × 8
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
<fct> <fct> <dbl> <dbl> <int> <int>
1 Adelie Torgersen 36.7 19.3 193 3450
2 Adelie Torgersen 39.3 20.6 190 3650
3 Adelie Torgersen 38.9 17.8 181 3625
4 Adelie Torgersen 39.2 19.6 195 4675
# ℹ 2 more variables: sex <fct>, year <int>
- Um die Reihen zusammenzuführen, nutzen wir
rbind()
aus demdplyr
Paket:
<- rbind(pinguReihen1, pinguReihen2)
alleReihen.pinguine alleReihen.pinguine
# A tibble: 8 × 8
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
<fct> <fct> <dbl> <dbl> <int> <int>
1 Adelie Torgersen 39.1 18.7 181 3750
2 Adelie Torgersen 39.5 17.4 186 3800
3 Adelie Torgersen 40.3 18 195 3250
4 Adelie Torgersen NA NA NA NA
5 Adelie Torgersen 36.7 19.3 193 3450
6 Adelie Torgersen 39.3 20.6 190 3650
7 Adelie Torgersen 38.9 17.8 181 3625
8 Adelie Torgersen 39.2 19.6 195 4675
# ℹ 2 more variables: sex <fct>, year <int>
Data Frames anhand einer gemeinsamen Spalte zusammenfügen
Wir haben zwei Datensätze, die eine gemeinsamt Spalte haben
Die gemeinsame Spalte ist oft ein Index oder individueller Pseudonimisierungscode, der für jede Beobachtung / Zeile einzigartig ist
Bei unserem Pinguin-Datensatz gibt es eine solche Spalte nicht, deshalb erstellen wir eine:
<- penguins |>
pinguine head(8)
<- c(1:8)
pinguIndex
<- cbind(pinguIndex, pinguine) pinguine
- Für deskriptive Auswertungen haben wir Geschlecht und Jahr aus dem Datensatz einzeln angeschaut und fehlende Werte ausgeschlossen:
<- pinguine |>
pinguGeschlecht select("pinguIndex", "sex") |>
na.omit()
pinguGeschlecht
pinguIndex sex
1 1 male
2 2 female
3 3 female
5 5 female
6 6 male
7 7 female
8 8 male
<- pinguine |>
pinguJahr select("pinguIndex", "year")
pinguJahr
pinguIndex year
1 1 2007
2 2 2007
3 3 2007
4 4 2007
5 5 2007
6 6 2007
7 7 2007
8 8 2007
Zusammenführen
Um die Daten wieder zusammenzuführen, nutzen wir
join()
- Funktionen aus dem Paketdplyr
.inner_join()
erhält nur die Daten, die in beiden Datensätzen vorkommen.full_join()
erhält alle Datenleft_join()
erhält alle Daten aus dem ersten Datensatzright_join()
erhält alle Daten aus dem zweiten Datensatz
<- inner_join(pinguGeschlecht, pinguJahr) pingu_inner
Joining with `by = join_by(pinguIndex)`
pingu_inner
pinguIndex sex year
1 1 male 2007
2 2 female 2007
3 3 female 2007
4 5 female 2007
5 6 male 2007
6 7 female 2007
7 8 male 2007
Durch
inner_join()
ist ein Wert inyear
ausgeschlossen worden, der zuvor aufgrund von NA in der Variablesex
aus dem ersten Datensatz gelöscht worden war.Mit
full_join()
oderright_join()
hätte man in dem Fall alle Daten erhalten.
Wichtig!
Überlege beim Anwenden von join()
-Methoden immer genau, was du damit bezweckst und welche Daten du nicht verlieren möchtest. So kannst du böse Überraschungen vermeiden.