Datensätze zusammenführen (Fälle hinzufügen)

Im nächsten Schritt nehmen wir nun an, dass die Datenerfassung getrennt nach Distrikt durchgeführt wurde und es somit fünf Teildatensätze gibt, die nun zu einem vollständigen Datensatz verbunden werden sollen. Dazu nutzen wir die Funktion bind_rows(). In unserem Beispiel haben alle fünf Teildatensätze genau die gleiche Anzahl an Variablen, die dazu auch noch genau gleich benannt sind! Mit dem Argument .id erstellen wir eine Variable names "origin", die die Herkunft des Falles erfasst. Dies ist automatisch nummeriert. Mit mutate() machen wir daraus einen Faktor, der eine bessere Beschreibung beinhaltet (process1, process2, process3, process4, process5)

pssAll <- pss1 %>%
  bind_rows(
    list(
      pss5,
      pss7, 
      pss10, 
      pss12
    ), 
    .id = "origin"
  ) %>%
  mutate(
    origin = factor(
      origin, 
      labels = c(
        "process1", 
        "process2", 
        "process3", 
        "process4",
        "process5"
      )
    )
  )

table(pssAll$origin)
## 
## process1 process2 process3 process4 process5 
##     1000     1000     1000     1000     1000
head(pssAll$origin)
## [1] process1 process1 process1 process1 process1 process1
## Levels: process1 process2 process3 process4 process5

Wir haben hier jetzt also aus fünf Teildatensätzen einen gesamten Datensatz erstellt, der alle Fälle der fünf Teildatensätze enthält. Wichtig, in diesem Fall waren alle Variablennamen gleich!

Nun probieren wir einmal aus, was passiert, wenn es zum Beispiel in einem Teildatensatz einen Typo gibt. Zuerst erstellen wir dazu einfach zwei neue Datensätze, die jeweils nur 3 Fälle inkludieren, und unterschiedliche Variablen.

pssA <- pss[1:3, 2:3]

District <- c(
  "Distrikt 1", 
  "Distrikt 5",
  "Distrikt 7"
)

gndr <- c(
  "male",
  "female",
  "female"
)

pssB <- data.frame(
  District, 
  gndr
)

head(pssA)
##     district gndr
## 1 Distrikt 1 male
## 2 Distrikt 1 male
## 3 Distrikt 1 male
head(pssB)
##     District   gndr
## 1 Distrikt 1   male
## 2 Distrikt 5 female
## 3 Distrikt 7 female

Wir haben also in beiden Datensätzen die zwei Variablen, die Distrikt und Geschlecht angeben. Im Datensatz pssB ist aber die Variable des Distrikts anders geschrieben. Probieren wir bind_rows() aus.

pssTest <- pssA %>% 
  bind_rows(pssB)

pssTest
##     district   gndr   District
## 1 Distrikt 1   male       <NA>
## 2 Distrikt 1   male       <NA>
## 3 Distrikt 1   male       <NA>
## 4       <NA>   male Distrikt 1
## 5       <NA> female Distrikt 5
## 6       <NA> female Distrikt 7

Da die Variablennamen nicht genau gleich sind, werden nun drei Variablen geschaffen: district, gndr und District. Wo die Variable nicht vorliegt, werden automatisch NAs erzeugt. Dies ist vorteilhaft, kann aber auch frickelig werden, wenn bei der Datensatzerstellung nicht streng nach einem Codenamen-Schema gearbeitet wurde. Lösung: Im Vorfeld Variablen abklären und umbenennen. Andernfalls kann man full_join() nutzen.

Datensätze zusammenführen (unterschiedliche Spaltennamen)

Dieser Ansatz ist nicht weniger aufwändig, als das Umbenennen von Spaltennamen, bietet aber dennoch eine Alternative. Mit full_join() kombinieren wir zwei Datensätze und können im Argument by angeben, welche Spalten jeweils denselben Inhalt haben. Schreibaufwand hierbei ist, dass gleiche Spaltennamen auch aufgeführt werden müssen, da ansonsten (hier im Beispiel) die Variablen gndr.x und gndr.y gebildet werden. Dies liegt daran, da full_join() eigentlich dafür gedacht ist, neue/zusätzliche Variablen hinzuzufügen.

In unserem Beispiel würden wir also angeben, dass aus Datensatz pssA die Spalte district gleich der Spalte District aus dem Datensatz pssB ist. Gleiches gilt für die gndr Variable.

pssTest2 <- pssA %>% 
  full_join(
    pssB,
    by = c(
      "district" = "District", 
      "gndr" = "gndr"
    )
  )

head(pssTest2)
##     district   gndr
## 1 Distrikt 1   male
## 2 Distrikt 1   male
## 3 Distrikt 1   male
## 4 Distrikt 5 female
## 5 Distrikt 7 female

So klappt es dann auch mit unterschiedlichen Variablennamen!