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.