Table of Content
- 1 Introduction
- 2 Choose variables
- 2.1 $ sign
- 2.2 Index Function
- 2.3 Mulitble choose of variables
- 2.3.1 via data.frame function
- 2.3.2 via index function
- 2.3.3 via subset function
- 3 Change object’s charactersitics
- 3.1 characters to factores
- 3.2 factores to vectores
- 4 Create new variables
- 4.1 Transformation of two single variables
- 4.2 Transformation of multible variables
- 4.3 rowSums and rowMeans function
- 4.4 Center and standardize variables
- 4.5 Turn over variables
- 4.6 turn over single values
- 4.6.1 via which function
- 4.6.2 via ifelse function
- 4.6.3 recode function
- 5 Conclusion
1 Introduction
Datenaufbereitung ist ein zentrales und zeitintensives Thema in der Datenanalyse. Als erstes wird in diesem Post auf die Auswahl einzelner Variablen eingegangen, sodass man weitere Operationen mit ihnen durchführen kann. Anschließend werden die unterschiedlichen Möglichkeiten der Bearbeitung von Variablen vorgestellt. Für diesen Post wurde der Datensatz olympics von der Statsistik Plattform Kaggle https://www.kaggle.com verwendet. Eine Kopie des Datensatzes ist unter https://drive.google.com/open?id=1XsV3WVTb0EXjd9LhlpN2PkvUKJU8iY38 abrufbar.
library("tidyverse")
olympics <- read_csv("olympics.csv")
2 Choose variables
Die meisten Funktionen, die wir durchführen, beziehen sich auf Teilmengen aus den Variablen in unserem Datensatz. In R gibt es verschiedene Wege bestimmte Variablen auszuwählen. Die wichtigsten sollen hier vorgestellt werden.
2.1 $ sign
Bei dieser Möglichkeit nennt man zunächst den Namen des Data Frames und anschließend den Namen der Variablen: olympics$Age
. Das Dollarzeichen $ wird dabei als Trennzeichen verwendet. Einen guten Überblick über eine metrische Variable bekommt man in Verbindung mit der summary() Funktion.
summary(olympics$Age)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 10.00 21.00 24.00 25.56 28.00 97.00 9474
2.2 Index Function
Bei Objekten mit einer definierten Anzahl an Dimensionen (Data Frame oder Tabellen), können einzelne Elemente über eckige Klammern [] ausgewählt werden. Verwendet man die Option mit dem Dollarzeichen in Verbindung mit der Indexfunktion, so gibt R den Wert der angegebenen Zeile aus der definierten Spalte aus (hier: Zeile 2 aus der Variablen „Height“).
olympics$Height[2]
## [1] 170
Es besteht auch die Möglichkeit, einen Index für jede Dimension direkt in die eckige Klammer zu schreiben und sich so den Wert aus der zweiten Zeile aus der fünften Spalte ausgeben zu lassen.
olympics[2,5]
## # A tibble: 1 x 1
## Height
## <int>
## 1 170
Des Weiteren ist es möglich, einen dieser Indizes einfach weg zu lassen. Lässt man beispielsweise den ersten Index weg, so wird anstelle einer einzelnen Zeile einfach alle Zeilen hergenommen. Im nachfolgenden Beispiel wird der Summenwert aller Zeilen für die Spalte vier (Alter) berechnet:
sum(na.omit(olympics[,4]))
## [1] 6686758
Die Indexfunktion lässt sich auch nutzen, um bestimmte Zeilen oder Spalten auszuschließen. Dafür schreibt man vor dem Index ein Minuszeichen. Zuvor haben wir den Summenwert aller Altersangaben ausgeben lassen. Nun möchten wir dieselbe Summe ohne der ersten Person (24 Jahre alt) berechnen:
sum(na.omit(olympics[-1,4]))
## [1] 6686734
Man sieht die Differenz zwischen Summe 1 (6.686.758) und Summe 2 (6.686.734) beträgt genau das Alter (24) der Person, welche wir gerade ausgeschlossen hatten.
2.3 Mulitble choose of variables
Häufig wird nicht nur ein Wert (zB. Mittelwert) für eine Variable benötigt, sondern die Werte für mehrere Spalten. Die dazugehörige Funktion lautet colMeans. Für die Auswahl mehrerer Variablen in R gibt es diverse Möglichkeiten:
2.3.1 via data.frame function
Im nachfolgenden Beispiel erstellen wir einen neuen Data Frame mit dem Namen „Auswahl1“, welcher die Variablen Height
und Weight
enthält.
Auswahl1 <- data.frame(olympics$Height, olympics$Weight)
Nun kann auch die Funktion colMeans angewandt werden. Durch das Zusatzargument na.omit werden fehlende Werte (NAs) nicht berücksichtigt.
colMeans(na.omit(Auswahl1))
## olympics.Height olympics.Weight
## 175.35910 70.67737
Innerhalb der Data Frame Funktion kann man auch eigene Variablennamen definieren:
Auswahl2 <- data.frame(Groesse = olympics$Height, Gewicht = olympics$Weight)
colMeans(na.omit(Auswahl2))
## Groesse Gewicht
## 175.35910 70.67737
2.3.2 via index function
Es lassen sich auch via der Indexfunktion mit dem Zusatzargument c() mehrere Spalten gleichzeitig auswählen. Im nachfolgenden Beispiel werden die Spalten fünf und sechs dem Objekt „Auswahl3“ zugeordnet.
Auswahl3 <- olympics[, c(5,6)]
Anstelle der Indizes kann man auch die Variablennamen direkt angeben:
Auswahl4 <- olympics[, c("Height", "Weight")]
colMeans(na.omit(Auswahl3))
## Height Weight
## 175.35910 70.67737
colMeans(na.omit(Auswahl4))
## Height Weight
## 175.35910 70.67737
2.3.3 via subset function
Die subset Funktion ist sehr flexibel, da man mit ihr nicht nur Variablen, sondern auch Untergruppen von Observations auswählen kann. Zudem lässt sich der Befehl auch abkürzen, wenn man Variablen auswählt, die in dem Data Frame unmittelbar hintereinanderstehen. Im nachfolgenden Beispiel wählen wir die Spalten „Sex“(3) bis „Weight“(6) aus.
Auswahl5 <- subset(olympics, select = Sex:Weight)
Mit dem Befehl glimpse sehen wir, dass das neue Objekt „Auswahl5“ vier Variablen (von „Sex“ bis „Weight“) hat.
glimpse(Auswahl5)
## Observations: 271,116
## Variables: 4
## $ Sex <chr> "M", "M", "M", "M", "F", "F", "F", "F", "F", "F", "M", ...
## $ Age <int> 24, 23, 24, 34, 21, 21, 25, 25, 27, 27, 31, 31, 31, 31,...
## $ Height <int> 180, 170, NA, NA, 185, 185, 185, 185, 185, 185, 188, 18...
## $ Weight <dbl> 80, 60, NA, NA, 82, 82, 82, 82, 82, 82, 75, 75, 75, 75,...
3 Change object’s charactersitics
Objekte spielen eine zentrale Rolle bei der Arbeit mit R. Es gibt unterschiedliche Objekttypen: Beispielsweise Vektoren, Faktoren oder Data Frames. Numerische Variablen können in R sowohl als Vektoren, als auch in Faktoren gespeichert werden. Wohingegen Vektoren ordinalskalierte oder metrische Daten enthalten, beinhalten Faktoren nominalskalierte Variablen. Werden nummerische Daten in R eingelesen, werden diese meist als numerischen Vektor gespeichert, unabhängig vom tatsächlichen Skalenniveau. Es ist daher manchmal notwendig, die Objekteigenschaften zu konvertieren.
3.1 characters to factores
class(olympics$Sex)
## [1] "character"
Wir sehen, dass die Variable Sex
in diesem Fall als „character“ gespeichert ist. Um diese nun in einen Faktor zu konvertieren verwendet man die factor Funktion:
olympics.sex.factor <- factor(olympics$Sex)
head(olympics.sex.factor)
## [1] M M M M F F
## Levels: F M
Vor dem Zuweisungspfeil steht der Name des neuen Faktors. Wenn der neue und alte Name identisch ist, wird der alte überschrieben. Wenn wir ihn beibehalten möchten, empfiehlt es sich (wie im Beispiel) ein neues, zusätzliches Objekt anzulegen. Betrachtet man den neuen Data Frame, sehen wir, dass die Variable Sex
weiterhin als „M“ und „F“ ausgegeben wird. Es ist manchmal sinnvoll, Abkürzungen oder Zahlen in aussagekräftigere Begriffe umzuwandeln. Wir modifizieren daher den Befehl wie folgt:
olympics.sex.factor <- factor(olympics$Sex, levels = c("F", "M"), labels = c("weiblich", "m?nnlich"))
head(olympics.sex.factor)
## [1] m?nnlich m?nnlich m?nnlich m?nnlich weiblich weiblich
## Levels: weiblich m?nnlich
Man erkennt eine erfolgreiche Konvertierung in einen Faktor unter anderem daran, dass bei dem Output des head Befehls die levels „weiblich“ „männlich“ ausgegeben werden.
3.2 factores to vectores
Manchmal ist es aber auch sinnvoll einen Faktor in einen Vektor zu konvertieren. Wir überprüfen die Objekteigenschaft nochmals mit dem class Befehl:
class(olympics.sex.factor)
## [1] "factor"
Bevor die Konvertierung von einem Faktor in einen Vektor erfolgt, sollte man sich nochmal die Faktorstufen mit dem Befehl levels ausgeben lassen:
levels(olympics.sex.factor)
## [1] "weiblich" "m?nnlich"
Wir sehen, dass die Faktorstufe „weiblich“ zuerst aufgeführt wird. Nun wird mittels der as.numeric Funktion der Faktor in ein Vektor umgewandelt:
olympics.sex.vector <- as.numeric(olympics.sex.factor)
class(olympics.sex.vector)
## [1] "numeric"
head(olympics.sex.vector)
## [1] 2 2 2 2 1 1
Die Werte der neuen Variablen sind nun 1 und 2. Doch was ist nun was? Aus diesem Grund wurden zuvor nochmals die Faktorstufen abgefragt. Da „weiblich“ an erster Stelle Stand, steht die 1 in der neuen Variablen nun für „weiblich“ und die 2 für „männlich“.
4 Create new variables
Es gibt viele Gründe, warum man aus vorhandenen Variablen neue erstellen muss. So ist es manchmal notwendig, eine Variable zu zentrieren oder zu standardisieren oder bei Auswertungen von Fragebögen die Variablen umzukodieren.
4.1 Transformation of two single variables
In dem Datensatz ist das Jahr in dem die Spiele statt fanden angegeben und das Alter der jeweiligen Athleten. Mittels dieser beiden Angaben, kann man das jeweilige Geburtsjahr berechnen:
olympics$GebJahr <- olympics$Year - olympics$Age
Vor dem Zuweisungspfeil steht der Name der neuen Variable, hier „GebJahr“. Durch den Ausdruck olympics$ wird diese Variable automatisch den olympics-Daten hinzugefügt.
glimpse(olympics)
## Observations: 271,116
## Variables: 16
## $ ID <int> 1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, ...
## $ Name <chr> "A Dijiang", "A Lamusi", "Gunnar Nielsen Aaby", "Edgar...
## $ Sex <chr> "M", "M", "M", "M", "F", "F", "F", "F", "F", "F", "M",...
## $ Age <int> 24, 23, 24, 34, 21, 21, 25, 25, 27, 27, 31, 31, 31, 31...
## $ Height <int> 180, 170, NA, NA, 185, 185, 185, 185, 185, 185, 188, 1...
## $ Weight <dbl> 80, 60, NA, NA, 82, 82, 82, 82, 82, 82, 75, 75, 75, 75...
## $ Team <chr> "China", "China", "Denmark", "Denmark/Sweden", "Nether...
## $ NOC <chr> "CHN", "CHN", "DEN", "DEN", "NED", "NED", "NED", "NED"...
## $ Games <chr> "1992 Summer", "2012 Summer", "1920 Summer", "1900 Sum...
## $ Year <int> 1992, 2012, 1920, 1900, 1988, 1988, 1992, 1992, 1994, ...
## $ Season <chr> "Summer", "Summer", "Summer", "Summer", "Winter", "Win...
## $ City <chr> "Barcelona", "London", "Antwerpen", "Paris", "Calgary"...
## $ Sport <chr> "Basketball", "Judo", "Football", "Tug-Of-War", "Speed...
## $ Event <chr> "Basketball Men's Basketball", "Judo Men's Extra-Light...
## $ Medal <chr> NA, NA, NA, "Gold", NA, NA, NA, NA, NA, NA, NA, NA, NA...
## $ GebJahr <int> 1968, 1989, 1896, 1866, 1967, 1967, 1967, 1967, 1967, ...
4.2 Transformation of multible variables
Für das nachfolgende Beispiel erstellen wir kurz einen eigenen Data Frame:
a <- c("Christian", "Maria", "Andreas")
b <- c(2, 3, 1)
c <- c(3, 1, 5)
d <- c(2, 4, 1)
e <- c(1, 2, 2)
f <- c(2, 4, 3)
Noten <- data.frame(a, b, c, d, e, f)
colnames(Noten) <- c("Gewicht", "Note1", "Note2", "Note3", "Note4", "Note5")
Noten
## Gewicht Note1 Note2 Note3 Note4 Note5
## 1 Christian 2 3 2 1 2
## 2 Maria 3 1 4 2 4
## 3 Andreas 1 5 1 2 3
Wir möchten nun eine neue Variable mit der Summe aller Noten erstellen:
Noten$Summe_Noten <- Noten$Note1 + Noten$Note2 + Noten$Note3 + Noten$Note4 + Noten$Note5
Noten
## Gewicht Note1 Note2 Note3 Note4 Note5 Summe_Noten
## 1 Christian 2 3 2 1 2 10
## 2 Maria 3 1 4 2 4 14
## 3 Andreas 1 5 1 2 3 12
Und nun eine Weitere mit dem Notendurchschnitt:
Noten$Notendurchschnitt <- (Noten$Note1 + Noten$Note2 + Noten$Note3 + Noten$Note4 + Noten$Note5) / 5
Noten
## Gewicht Note1 Note2 Note3 Note4 Note5 Summe_Noten Notendurchschnitt
## 1 Christian 2 3 2 1 2 10 2.0
## 2 Maria 3 1 4 2 4 14 2.8
## 3 Andreas 1 5 1 2 3 12 2.4
4.3 rowSums and rowMeans function
Für die Berechnung von Mittelwerten oder Summenwerten gibt es in R eigene Funktionen.
Noten$rowSums <- rowSums(Noten[c("Note1","Note2","Note3","Note4","Note5")], na.rm=TRUE)
Noten$rowMeans <- rowMeans(Noten[c("Note1","Note2","Note3","Note4","Note5")], na.rm=TRUE)
Noten
## Gewicht Note1 Note2 Note3 Note4 Note5 Summe_Noten Notendurchschnitt
## 1 Christian 2 3 2 1 2 10 2.0
## 2 Maria 3 1 4 2 4 14 2.8
## 3 Andreas 1 5 1 2 3 12 2.4
## rowSums rowMeans
## 1 10 2.0
## 2 14 2.8
## 3 12 2.4
Wir erkennen, dass die Werte von Summe_Noten und Notendurchschnitt gleich sind mit rowSums und rowMeans. Allerdings lässt sich die rowSums und rowMeans Funktion auch einfacher verwenden.
Noten$rowSums2 <- rowSums(Noten[,2:6])
Noten$rowMeans2 <- rowMeans(Noten[,2:6])
Noten
## Gewicht Note1 Note2 Note3 Note4 Note5 Summe_Noten Notendurchschnitt
## 1 Christian 2 3 2 1 2 10 2.0
## 2 Maria 3 1 4 2 4 14 2.8
## 3 Andreas 1 5 1 2 3 12 2.4
## rowSums rowMeans rowSums2 rowMeans2
## 1 10 2.0 10 2.0
## 2 14 2.8 14 2.8
## 3 12 2.4 12 2.4
Noten$Teilsumme <- rowSums(Noten[,c(2:3, 5:6)])
#entspricht Note1 + Note2 + Note4 + Note5
Noten
## Gewicht Note1 Note2 Note3 Note4 Note5 Summe_Noten Notendurchschnitt
## 1 Christian 2 3 2 1 2 10 2.0
## 2 Maria 3 1 4 2 4 14 2.8
## 3 Andreas 1 5 1 2 3 12 2.4
## rowSums rowMeans rowSums2 rowMeans2 Teilsumme
## 1 10 2.0 10 2.0 8
## 2 14 2.8 14 2.8 10
## 3 12 2.4 12 2.4 11
4.4 Center and standardize variables
Für viele statistische Analysen ist das Zentrieren oder Standardisieren von Variablen wichtig. Bei der Zentrierung von Variablen zieht man von jedem einzelnen Wert den Mittelwert der Variablen ab. Die zentrierte Variable hat dann den Mittelwert 0. Dies ist beispielsweise sinnvoll, wenn man eine Regressionsanalyse mit den Variablen Einkommen und Alter durchführt. Ein Einkommen bei einem einjährigen Kind macht dabei wenig Sinn, daher die Zentrierung des Alters. Um eine Variable zu standardisieren, teilt man zusätzlich noch durch die Standardabweichung der Variablen. Die standardisierte Variable hat dann den Mittelwert 0 und die Standardabweichung 1. Die einzelnen Werte der standardisierten Werte nennt man dann z-Werte. Eine Standardisierung ist oft notwendig, um Stichprobenwerte vergleichbar zu machen. Um Variablen zu zentrieren oder standardisieren, kann man in R die scale Funktion anwenden:
olympics$Age.z <- scale(olympics$Age)
glimpse(olympics)
## Observations: 271,116
## Variables: 17
## $ ID <int> 1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, ...
## $ Name <chr> "A Dijiang", "A Lamusi", "Gunnar Nielsen Aaby", "Edgar...
## $ Sex <chr> "M", "M", "M", "M", "F", "F", "F", "F", "F", "F", "M",...
## $ Age <int> 24, 23, 24, 34, 21, 21, 25, 25, 27, 27, 31, 31, 31, 31...
## $ Height <int> 180, 170, NA, NA, 185, 185, 185, 185, 185, 185, 188, 1...
## $ Weight <dbl> 80, 60, NA, NA, 82, 82, 82, 82, 82, 82, 75, 75, 75, 75...
## $ Team <chr> "China", "China", "Denmark", "Denmark/Sweden", "Nether...
## $ NOC <chr> "CHN", "CHN", "DEN", "DEN", "NED", "NED", "NED", "NED"...
## $ Games <chr> "1992 Summer", "2012 Summer", "1920 Summer", "1900 Sum...
## $ Year <int> 1992, 2012, 1920, 1900, 1988, 1988, 1992, 1992, 1994, ...
## $ Season <chr> "Summer", "Summer", "Summer", "Summer", "Winter", "Win...
## $ City <chr> "Barcelona", "London", "Antwerpen", "Paris", "Calgary"...
## $ Sport <chr> "Basketball", "Judo", "Football", "Tug-Of-War", "Speed...
## $ Event <chr> "Basketball Men's Basketball", "Judo Men's Extra-Light...
## $ Medal <chr> NA, NA, NA, "Gold", NA, NA, NA, NA, NA, NA, NA, NA, NA...
## $ GebJahr <int> 1968, 1989, 1896, 1866, 1967, 1967, 1967, 1967, 1967, ...
## $ Age.z <dbl> -0.2435104, -0.3999177, -0.2435104, 1.3205633, -0.7127...
Um die Variable zu zentrieren, muss das Zusatzargument scale=FALSE verwendet werden. Mit diesem Argument wird das Dividieren durch die Standardabweichung unterdrückt.
olympics$Age.cen <- scale(olympics$Age, scale = FALSE)
glimpse(olympics)
## Observations: 271,116
## Variables: 18
## $ ID <int> 1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, ...
## $ Name <chr> "A Dijiang", "A Lamusi", "Gunnar Nielsen Aaby", "Edgar...
## $ Sex <chr> "M", "M", "M", "M", "F", "F", "F", "F", "F", "F", "M",...
## $ Age <int> 24, 23, 24, 34, 21, 21, 25, 25, 27, 27, 31, 31, 31, 31...
## $ Height <int> 180, 170, NA, NA, 185, 185, 185, 185, 185, 185, 188, 1...
## $ Weight <dbl> 80, 60, NA, NA, 82, 82, 82, 82, 82, 82, 75, 75, 75, 75...
## $ Team <chr> "China", "China", "Denmark", "Denmark/Sweden", "Nether...
## $ NOC <chr> "CHN", "CHN", "DEN", "DEN", "NED", "NED", "NED", "NED"...
## $ Games <chr> "1992 Summer", "2012 Summer", "1920 Summer", "1900 Sum...
## $ Year <int> 1992, 2012, 1920, 1900, 1988, 1988, 1992, 1992, 1994, ...
## $ Season <chr> "Summer", "Summer", "Summer", "Summer", "Winter", "Win...
## $ City <chr> "Barcelona", "London", "Antwerpen", "Paris", "Calgary"...
## $ Sport <chr> "Basketball", "Judo", "Football", "Tug-Of-War", "Speed...
## $ Event <chr> "Basketball Men's Basketball", "Judo Men's Extra-Light...
## $ Medal <chr> NA, NA, NA, "Gold", NA, NA, NA, NA, NA, NA, NA, NA, NA...
## $ GebJahr <int> 1968, 1989, 1896, 1866, 1967, 1967, 1967, 1967, 1967, ...
## $ Age.z <dbl> -0.2435104, -0.3999177, -0.2435104, 1.3205633, -0.7127...
## $ Age.cen <dbl> -1.5568984, -2.5568984, -1.5568984, 8.4431016, -4.5568...
4.5 Turn over variables
Skalen werden bei Umfragen häufig sowohl positiv als auch negativ verwendet. Bevor man nun einen Skalenscore zusammenfasst, müssen einzelne Items umgepolt werden. Einfach geschieht das, wenn man alle einzelnen Werte der Variablen vom theoretischen Maximum + 1 subtrahiert. Nehmen wir dazu nochmal unser Data Frame mit den Noten her. Nehmen wir an, dass die Note5 umkodiert werden soll. Das theoretische Maximum von den Noten her wäre 6. Dies + 1 ergibt 7. Die Umpolung von Note5 geschieht nun wie folgt:
Noten$Note5.r <- 7 - Noten$Note5
Noten
## Gewicht Note1 Note2 Note3 Note4 Note5 Summe_Noten Notendurchschnitt
## 1 Christian 2 3 2 1 2 10 2.0
## 2 Maria 3 1 4 2 4 14 2.8
## 3 Andreas 1 5 1 2 3 12 2.4
## rowSums rowMeans rowSums2 rowMeans2 Teilsumme Note5.r
## 1 10 2.0 10 2.0 8 5
## 2 14 2.8 14 2.8 10 3
## 3 12 2.4 12 2.4 11 4
4.6 turn over single values
Manchmal möchte man nur einzelne Werte oder Wertebereiche innerhalb einer Variablen umkodieren. Dafür bietet sich die which Funktion an.
4.6.1 via which function
Die which Funktion gibt die Position von Observations aus, auf die eine bestimmte Bedingung zutrifft. Wir können uns beispielsweise mit folgender Syntax alle Goldmedaillen Gewinner aufführen lassen:
a<-which(olympics$Medal == "Gold")
head(a)
## [1] 4 43 45 49 61 74
Wichtig! Die ausgegebenen Werte beziehen sich auf die Zeilen, in denen die Daten der Person gespeichert sind. Man kann daher diese Ausgabe auch in der Index Funktion verwenden. Mit der Index Funktion werden gezielt bestimmte Zeilen und Spalten ausgewählt. Mit folgendem Befehl werden die Werte für die oben aufgeführten Zeilen ausgegeben. Natürlich handelt es sich bei jedem Wert um das Wort „Gold“, denn genau das war ja auch unsere Bedingung.
b<- olympics$Medal[which(olympics$Medal == "Gold")]
head(b)
## [1] "Gold" "Gold" "Gold" "Gold" "Gold" "Gold"
Nun kommt der Trick: Man kann nun jedes Wort durch ein beliebiges anderes Wort oder beliebigen anderen Wert ersetzten, indem man hinter dem obigen Befehl den Zuweisungspfeil und dann das neue Wort/ den neuen Wert aufführt. Wir ersetzen nun das Wort „Gold“ durch „First_Place“:
olympics$Medal[which(olympics$Medal == "Gold")] <- "First Place"
head(olympics$Medal)
## [1] NA NA NA "First Place" NA
## [6] NA
4.6.2 via ifelse function
Wie die which Funktion verwendet auch die ifelse Funktion logische Abfragen. Die which Funktion wird allerdings nur auf der linken Seite des Zuweisungspfeils angewandt und dient damit dem Auswählen bestimmter Fälle. Nur für diese bestimmte Auswahl wird eine Operation durchgeführt, alle anderen bleiben unberührt. Bei der ifelse Funktion ist das anders. Diese Funktion wird auf der rechten Seite des Zuweisungspfeils angewandt und ermöglicht es uns dadurch, für alle Fälle gleichzeitig verschiedene Operationen durchzuführen. Der Unterschied zwischen der which Funktion und der ifelse Funktion wird mit dem folgenden Beispiel verständlich:
olympics\(Altersgruppe1[which(olympics\)Age < 25)] <- 0
olympics\(Altersgruppe1[which(olympics\)Age >= 25)] <- 1
Wir haben nun mit zwei which Funktionen die Athleten in einer neuen Variablen Altersgruppe
in zwei Untergruppen unterteilt. Die unter 25 Jährigen erhielten den Wert 0, die über 25 Jährigen den Wert 1. Verwendet man stattdessen die ifelse Funktion, kann man die gleiche Operation in nur einem Befehl ausführen lassen:
olympics$Altersgruppe2 <- ifelse(olympics$Age >= 25, 1, 0)
glimpse(olympics$Altersgruppe2)
## num [1:271116] 0 0 0 1 0 0 1 1 1 1 ...
Es ist des Weiteren möglich, mehrere ifelse Funktionen ineinander zu schachteln:
olympics$Altersgruppe3 <- ifelse(olympics$Age >= 30, "alt", ifelse(olympics$Age < 20, "jung", "mittel"))
glimpse(olympics$Altersgruppe3)
## chr [1:271116] "mittel" "mittel" "mittel" "alt" "mittel" "mittel" ...
Ist die Person über 30 Jahre alt, erhält sie den Wert „alt“ und ist sie unter 20 Jahre alt, erhält sie den Wert „jung“. Trifft keines der beiden Argumente auf die Person zu (also die Person ist zwischen 20 und 29 Jahre alt) erhält sie den Wert „mittel“.
4.6.3 recode function
Ist man mit logischen Abfragen noch nicht so vertraut, kann man stattdessen auch die recode Funktion verwenden. Dazu erstellen wir in dem Noten Data Frame nochmals eine recode Variable für Note 5: Note5.r2
Wir können sehen, dass auch hier die Umkodierung geklappt hat, da die Variable Note5.r2
und die Variable Note5.r
gleiche Werte enthält.
Noten$Note5.r2 <- recode(Noten$Note5, `1`="6", `2`="5", `3`="4", `4`="3", `5`="2", `6`="1")
Noten
## Gewicht Note1 Note2 Note3 Note4 Note5 Summe_Noten Notendurchschnitt
## 1 Christian 2 3 2 1 2 10 2.0
## 2 Maria 3 1 4 2 4 14 2.8
## 3 Andreas 1 5 1 2 3 12 2.4
## rowSums rowMeans rowSums2 rowMeans2 Teilsumme Note5.r Note5.r2
## 1 10 2.0 10 2.0 8 5 5
## 2 14 2.8 14 2.8 10 3 3
## 3 12 2.4 12 2.4 11 4 4
5 Conclusion
In diesem Post bin ich auf die Standardfunktionen der Datenaufbereitung eingegangen. Datenaufbereitung ist eine der Hauptaufgaben in der Datenanalyse. Daher sollten die jeweiligen Möglichkeiten zur Aufbereitung vollumfänglich bekannt sein. Es gibt jedoch Funktionen und Pakete, die speziell für die Datenaufbereitung programmiert wurden und teilweise einfacher anzuwenden sind als die hier vorgestellten Funktionen. Das dplyr
Paket von Hadley Wickham zählt beispielsweise zu einem der beliebtesten R Pakete für diese Zwecke. In meinem vorangegangenen Post Data Transformation in R https://michael-fuchs.netlify.com/2018/08/18/data-transformation-in-r/ habe ich bereits einige Funktionen aus diesem Paket vorgestellt.
Source
Luhmann, M. (2011). R für Einsteiger.