In der Vorlesung haben Sie die verschiedenen Skalierungen von Variablen kennengelernt. Konkret unterscheiden wir zwischen (a) nominalskalierten Variablen, (b) ordinalskalierten Variablen, (c) intervallskalierten Variablen, und (d) metrisch skalierten Variablen. In R müssen wir dementsprechend auch darauf achten, dass die Variablen richtig formatiert sind - glücklicherweise unterscheiden wir hier in der Regel nur zwischen factor-variablen und numeric Variablen.
Nehmen wir an, dass wir folgenden Datensatz haben:
Id Name Alter groesse_m
1 1 Anna 25 1.75
2 2 Stephan 22 1.60
3 3 Ina 19 1.83
4 4 Matthias 29 1.95
5 5 Katrin 17 1.67
Id ist ordinalskaliert, Name ist nominalskaliert, Alter ist intervallskaliert, und groesse_m ist metrisch skaliert. Um die Formatierung der Variablen in R anzusehen, können wir die Funktion str() nutzen:
str(df)
'data.frame': 5 obs. of 4 variables:
$ Id : num 1 2 3 4 5
$ Name : chr "Anna" "Stephan" "Ina" "Matthias" ...
$ Alter : num 25 22 19 29 17
$ groesse_m: num 1.75 1.6 1.83 1.95 1.67
Wir sehen, dass Id, Alter, und groesse_m numerische (num) Variablen sind - R unterscheidet hier nicht zwischen intervall- und metrisch skalierten Variablen. Die Variable Name ist jedoch als einfache Buchstabenreihenfolge (chr) formatiert - wir wissen jedoch, dass sie nominalskaliert sein muss. Wir müssen sie also umformatieren; und wir nutzen die Techniken, die Sie in den Einführungskapiteln kennengelernt haben:
Umformatieren in baseR
Wir überschreiben die Variable Name in dem wir dieselben Werte nutzen, diese jedoch mittels as.factor() in eine nominalskalierte Variable umwandeln:
df$Name <-as.factor(df$Name)str(df)
'data.frame': 5 obs. of 4 variables:
$ Id : num 1 2 3 4 5
$ Name : Factor w/ 5 levels "Anna","Ina","Katrin",..: 1 5 2 4 3
$ Alter : num 25 22 19 29 17
$ groesse_m: num 1.75 1.6 1.83 1.95 1.67
Sie sehen, dass die Variable Name nun als factor mit 5 Leveln (ein Level je Name) umformatiert ist. Nun weiß R, wie es mit diesen Variablen umgehen muss in späteren Berechnungen.
Umformatieren in tidyverse
Die Formatierung von Variablen in tidyverse erfolgt analog:
df <- df %>%mutate(Name =as.factor(Name))
Die ifelse() Abfrage
Oftmals wollen wir Abfragen machen, und basierend auf dem Ergebnis der Abfrage eine weitere Operation durchführen. In R (und in allen anderen Programiersprachen) gibt es dazu die if+else-Abfrage. Was diese Abfrage macht, ist: wenn eine bestimmte Bedingung zutrifft, dann führe Operation 1 aus, anderfalls führe Operation 2 aus. Wir wenden das Beispiel auf unseren Datensatz an. Konkret erstellen wir eine neue Variable test, welche den Wert 1 enthält wenn eine Person älter ist als 20 Jahre, und den Wert 0 wenn sie jünger ist. Die Syntax ist gleich für baseR und tidyverse:
df$test <-ifelse(df$Alter >20, 1, 0)df
Id Name Alter groesse_m test
1 1 Anna 25 1.75 1
2 2 Stephan 22 1.60 1
3 3 Ina 19 1.83 0
4 4 Matthias 29 1.95 1
5 5 Katrin 17 1.67 0
Überprüfen Sie, ob die Berechnung stimmt. Können Sie sich vorstellen, wie man dieses Konstrukt mit anderen Funktionen die wir bereits kennen (z.B. aus dem Paket tidyverse) kombinieren kann?
Zusammenführen von Tabellen
Oftmals ist es so, dass wir in der Statistik, bzw. Datenanalyse, verschiedene Datensätze miteinander kombinieren wollen. In R spricht man dabei vom mergen von Datensätzen. Eine wichtige Bedingung dabei ist, dass die beiden Tabellen eine gemeinsame Spalte haben, in welcher die Werte der jeweiligen Observation (d.h. Zeile) gespeichert sind. Nehmen wir an, wir haben eine zweite Tabelle mit den Variablen Name und Gewicht. Die Variable Name haben wir schon umformatiert:
Name Gewicht
1 Anna 60
2 Katrin 55
3 Ina 71
4 Matthias 79
5 Stephan 83
Die generelle Idee beim merging ist, dass man die die beiden Datensätze definiert, und dann die korrespondierenden Spaltennamen zueinander in Beziehung bringt. Dabei gibt es in baseR und tidyverse unterschiedliche Funktionen und Parameter. Wir stellen unten beide Versionen vor. Welche Sie letztendlich benutzen, bleibt Ihnen überlassen.
Name Id Alter groesse_m test Gewicht
1 Anna 1 25 1.75 1 60
2 Ina 3 19 1.83 0 71
3 Katrin 5 17 1.67 0 55
4 Matthias 4 29 1.95 1 79
5 Stephan 2 22 1.60 1 83
Hat alles gepasst. Möglicherweise haben Sie es schon bemerkt: für das mergen ist es unerheblich, ob die Zeilen in der gleichen Reihenfolge sind. Wichtig ist, dass die Werte zueinander kompatibel sind.
Merging in tidyverse
Im Paket tidyverse gibt es mehrere Möglichkeiten des merging. Wir benutzen hier den inner_join(), aber Sie können hier noch mehr erfahren.
df3 <-inner_join(df, df2, by =c('Name'='Name'))df3
Id Name Alter groesse_m test Gewicht
1 1 Anna 25 1.75 1 60
2 2 Stephan 22 1.60 1 83
3 3 Ina 19 1.83 0 71
4 4 Matthias 29 1.95 1 79
5 5 Katrin 17 1.67 0 55