7 min read

Data Management in R

Table of Content

  • 1 Introduction
  • 2 Combine Observations
  • 2.1 Special Case 1: Different variables within a Data Frame
  • 2.2 special case 2: Combine Observations with different colnames
  • 3 Combine Variables
  • 3.1 Special case 1: Combine variables by one variable with different spellings
  • 3.2 Special case 2: Combine variables with different number of observations
  • 4 Conclusion

1 Introduction

In dem nachfolgenden Post geht es um Data Management in R. Häufig sind Daten, die für eine Analyse benötigt werden, in unterschiedlichen Data Frames abgespeichert. Es ist daher notwendig, alle benötigten Daten in einem Data Frame zusammen zu fassen. Dabei unterscheidet man zwischen zwei Fällen:

  • Die Data Frames enthalten dieselben Variablen aber unterschiedliche Observations
  • Die Data Frames enthalten dieselben Observations aber unterschiedliche Variablen

2 Combine Observations

library("tidyverse")
library("plyr")

Wir möchten zwei Data Frames zusammenfügen, die dieselben Variablen, aber unterschiedliche Observations enthalten. Wir kreieren hierfür zwei Data Frames:

a1 <- c("Martin", "Veronika", "Susanne")
b1 <- c(180, 160, 165)
c1 <- c(80, 60, 65)
Datensatz1 <- data.frame(a1, b1, c1)
colnames(Datensatz1) <- c("Name", "Größe", "Gewicht")
x1 <- c("Christian", "Maria", "Andreas")
y1 <- c(190, 163, 170)
z1 <- c(92, 55, 72)
Datensatz2 <- data.frame(z1, y1, x1)
colnames(Datensatz2) <- c("Gewicht", "Größe", "Name")

Datensatz1
##       Name Größe Gewicht
## 1   Martin   180      80
## 2 Veronika   160      60
## 3  Susanne   165      65
Datensatz2
##   Gewicht Größe      Name
## 1      92   190 Christian
## 2      55   163     Maria
## 3      72   170   Andreas

Die beiden Data Frames Datensatz1 und Datensatz2 können nun mit dem Befehl rbind() in einem neuen Objekt mit dem Namen Beide_Gruppen zusammengefügt werden:

Beide_Gruppen <- rbind(Datensatz1, Datensatz2)
Beide_Gruppen
##        Name Größe Gewicht
## 1    Martin   180      80
## 2  Veronika   160      60
## 3   Susanne   165      65
## 4 Christian   190      92
## 5     Maria   163      55
## 6   Andreas   170      72

Voraussetzung für diese Funktion ist, dass die beiden Data Frames dieselben Variablen enthalten. Die Reihenfolge der Variablen kann innerhalb der Data Frames beliebig sein. Wichtig ist, dass die Anzahl und die Namen der Variablen genau übereinstimmen.

2.1 Special Case 1: Different variables within a Data Frame

Es kann natürlich vorkommen, dass die unterschiedlichen Data Frames unterschiedliche Variablen enthalten. Dennoch können sie mit einer kleinen Anpassung des rbind() Befehls zusammengefügt werden.

a5 <- c("Martin", "Veronika", "Susanne")
b5 <- c(180, 160, 165)
c5 <- c(80, 60, 65)
Datensatz3 <- data.frame(a5, b5, c5)
colnames(Datensatz3) <- c("Name", "Größe", "Gewicht")
x5 <- c("Christian", "Maria", "Andreas")
y5 <- c(190, 163, 170)
z5 <- c(32, 25, 27)
Datensatz4 <- data.frame(x5, y5, z5)
colnames(Datensatz4) <- c("Name", "Größe", "BMI")

Datensatz3
##       Name Größe Gewicht
## 1   Martin   180      80
## 2 Veronika   160      60
## 3  Susanne   165      65
Datensatz4
##        Name Größe BMI
## 1 Christian   190  32
## 2     Maria   163  25
## 3   Andreas   170  27

In unserem Beispiel enthalten beide Data Frames die Variablen Name und Größe. Unterscheiden tun sie sich bei ihrer dritten Variable. Data Frame “Datensatz3” beinhaltet noch die Variable Gewicht und Data Frame “Datensatz4” beinhaltet zusätzlich noch die Variable BMI. Durch die Anpassung des rbind() Befehls durch den Zusatz .fill ist es möglich, dennoch beide Datensätze zusammen zu fügen. Die Fälle aus dem Data Frame, in dem die Variablen fehlten, erhalten auf diesen Variablen fehlende Werte (NA).

Beide_Gruppen2 <- rbind.fill(Datensatz3, Datensatz4)
Beide_Gruppen2
##        Name Größe Gewicht BMI
## 1    Martin   180      80  NA
## 2  Veronika   160      60  NA
## 3   Susanne   165      65  NA
## 4 Christian   190      NA  32
## 5     Maria   163      NA  25
## 6   Andreas   170      NA  27

2.2 special case 2: Combine Observations with different colnames

Um zwei Data Frames mit unterschiedlichen Spaltennamen zusammen fügen zu können, müssen diese vereinheitlicht werden. Die kann man entweder mit dem gezeigten colnames() Befehl machen oder über eine R Funktion (siehe dazu Abschnitt: “Special case 2: Combine variables with with different number of observations”)

3 Combine Variables

Nun möchten wir zwei Data Frames zusammenfügen, welche dieselben Personen aber unterschiedliche Variablen enthalten. Dies ist häufig bei Längsschnittstudien mit unterschiedlichen Messzeitpunkten (Mzp) der Fall. Wichtig dabei ist, dass mindestens eine gleiche Variable in beiden Datensätzen vorkommt. Dies könnte beispielsweise eine ID Nummer sein, welche bei Studien pro Person vergeben werden. Wir kreieren für das nachfolgende Beispiel die beiden Datensätze Mzp1 und Mzp2:

a2 <- c("Martin", "Veronika", "Susanne")
b2 <- c(80, 60, 65)
Mzp1 <- data.frame(a2, b2)
colnames(Mzp1) <- c("Name", "Gewicht")
y2 <- c("Martin", "Veronika", "Susanne")
z2 <- c(78, 57, 61)
Mzp2 <- data.frame(y2, z2)
colnames(Mzp2) <- c("Name", "Gewicht")
Mzp1
##       Name Gewicht
## 1   Martin      80
## 2 Veronika      60
## 3  Susanne      65
Mzp2
##       Name Gewicht
## 1   Martin      78
## 2 Veronika      57
## 3  Susanne      61

Mit dem merge() Befehl lassen sich die unterschiedlichen Variablen in einem Datensatz zusammenführen:

Beide_Mzp <- merge(Mzp1, Mzp2, by = "Name")
colnames(Beide_Mzp) <- c("Name", "Gewicht_Mzp1", "Gewicht_Mzp2")
Beide_Mzp
##       Name Gewicht_Mzp1 Gewicht_Mzp2
## 1   Martin           80           78
## 2  Susanne           65           61
## 3 Veronika           60           57

3.1 Special case 1: Combine variables by one variable with different spellings

Es kann vorkommen, dass die Variable, über die man die Fälle aus beiden Datensätzen miteinander in Verbindung bringen möchte, unterschiedlich benannt ist. Im nachfolgenden Beispiel wird die Namensspalte im Data Frame “Mzp3” mit Name bezeichnet und im Data Frame “Mzp4” mit first_name.

a3 <- c("Martin", "Veronika", "Susanne")
b3 <- c(80, 60, 65)
Mzp3 <- data.frame(a3, b3)
colnames(Mzp3) <- c("Name", "Gewicht")
y3 <- c("Martin", "Veronika", "Susanne")
z3 <- c(78, 57, 61)
Mzp4 <- data.frame(y3, z3)
colnames(Mzp4) <- c("first_name", "Gewicht")
Mzp3
##       Name Gewicht
## 1   Martin      80
## 2 Veronika      60
## 3  Susanne      65
Mzp4
##   first_name Gewicht
## 1     Martin      78
## 2   Veronika      57
## 3    Susanne      61

Anstelle des by - Argumentes gibt es nun die Zusatzargumente by.x und by.y. Mit by.x wird die Schreibweise der Namesspalte aus Dataframe “Mzp3” festgelegt und mit by.y die Schreibweise aus Dataframe “Mzp4”.

Beide_Mzp2 <- merge(Mzp3, Mzp4, by.x = "Name", by.y = "first_name")
colnames(Beide_Mzp2) <- c("Name", "Gewicht_Mzp1", "Gewicht_Mzp2")
Beide_Mzp2
##       Name Gewicht_Mzp1 Gewicht_Mzp2
## 1   Martin           80           78
## 2  Susanne           65           61
## 3 Veronika           60           57

3.2 Special case 2: Combine variables with different number of observations

Bis jetzt sind wir davon ausgegangen, dass beide Dataframes dieselbe Anzahl an Personen beinhaltet. Was passiert, wenn wie im nachfolgenden Beispiel zwei gleiche Namen und jeweils ein neuer Name enthalten ist?

a4 <- c("Martin", "Veronika", "Walter")
b4 <- c(80, 60, 65)
Mzp5 <- data.frame(a4, b4)
colnames(Mzp5) <- c("Name", "Gewicht")
y4 <- c("Martin", "Veronika", "Sven")
z4 <- c(78, 57, 61)
Mzp6 <- data.frame(y4, z4)
colnames(Mzp6) <- c("Name", "Gewicht")
Mzp5
##       Name Gewicht
## 1   Martin      80
## 2 Veronika      60
## 3   Walter      65
Mzp6
##       Name Gewicht
## 1   Martin      78
## 2 Veronika      57
## 3     Sven      61
Beide_Mzp3 <- merge(Mzp5, Mzp6, by = "Name")
colnames(Beide_Mzp3) <- c("Name", "Gewicht_Mzp1", "Gewicht_Mzp2")
Beide_Mzp3
##       Name Gewicht_Mzp1 Gewicht_Mzp2
## 1   Martin           80           78
## 2 Veronika           60           57

Wie wir sehen, werden nur Werte für Observations ausgegeben, welche in beiden Datensätzen vorhanden sind. In unserem Fall sind dies die Namen “Martin” und “Veronika”. “Walter” und “Sven” wurden nicht berücksichtigt. Dies ist manchmal aber sinnvoll bzw. notwendig. Mit dem Zusatzargument all=TRUE werden alle Personen aus den beiden Data Frames beibehalten.

Beide_Mzp4 <- merge(Mzp5, Mzp6, by = "Name", all = TRUE)
colnames(Beide_Mzp4) <- c("Name", "Gewicht_Mzp1", "Gewicht_Mzp2")
Beide_Mzp4
##       Name Gewicht_Mzp1 Gewicht_Mzp2
## 1   Martin           80           78
## 2 Veronika           60           57
## 3   Walter           65           NA
## 4     Sven           NA           61

Der neue Data Frame enthält nun 4 Observations. Für die Namen, welche nur in einem der ursprünglichen Data Frames vertreten waren, werden die Daten auf den Variablen des anderen Data Frames mit NA angegeben. Der Befehl kann noch weiter verfeinert werden, wenn man beispielsweise alle Personen aus dem ersten Data Frame “Mzp5” im neuen Data Frame behalten, aber keinen neuen Fall aus Data Frame “Mzp6” in den neuen Data Fram mit aufnehmen möchte.

Beide_Mzp5 <- merge(Mzp5, Mzp6, by = "Name", all.x = TRUE)
colnames(Beide_Mzp5) <- c("Name", "Gewicht_Mzp1", "Gewicht_Mzp2")
Beide_Mzp5
##       Name Gewicht_Mzp1 Gewicht_Mzp2
## 1   Martin           80           78
## 2 Veronika           60           57
## 3   Walter           65           NA

Dies ist mit all.y=TRUE selbstverständlich auch anders herum möglich.

4 Conclusion

Für die Arbeit mit Big Data ist die Beherrschung von Data Management Befehlen wie rbind() oder merge() unerlässlich aber auch relativ einfach anzuwenden.