Zwei Data Frames kombinieren

Author

Claudia Spannbauer

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:

library(dplyr)
library(palmerpenguins)
data("penguins")

Spalten aneinander reihen

  • Hier erstellen wir zwei Datensätze durch Auswahl von Spaltenindizes:
pinguSpalten1 <- penguins |>
  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
pinguSpalten2 <- penguins |>
  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 dem dplyr Paket verwenden:
alleSpalten.pinguine <- cbind(pinguSpalten1, pinguSpalten2)
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:
pinguReihen1 <- penguins[c(1:4), ]
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>
pinguReihen2 <- penguins[c(5:8), ]
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 dem dplyr Paket:
alleReihen.pinguine <- rbind(pinguReihen1, pinguReihen2)
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:

pinguine <- penguins |>
  head(8)
pinguIndex <- c(1:8)

pinguine <- cbind(pinguIndex, pinguine)
  • Für deskriptive Auswertungen haben wir Geschlecht und Jahr aus dem Datensatz einzeln angeschaut und fehlende Werte ausgeschlossen:
pinguGeschlecht <- pinguine |>
  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
pinguJahr <- pinguine |>
  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 Paket dplyr.

  • inner_join() erhält nur die Daten, die in beiden Datensätzen vorkommen.

  • full_join() erhält alle Daten

  • left_join() erhält alle Daten aus dem ersten Datensatz

  • right_join() erhält alle Daten aus dem zweiten Datensatz

pingu_inner <- inner_join(pinguGeschlecht, pinguJahr)
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 in year ausgeschlossen worden, der zuvor aufgrund von NA in der Variable sex aus dem ersten Datensatz gelöscht worden war.

  • Mit full_join() oder right_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.