temperature <- c("111", "150", "123")Prepro 2: Demo
Piping
Gegeben ist ein character vector (temperature) mit Temperaturwerten in Fahrenheit. Das Ziel ist es, die mittlere Temperatur in Grad Celsius zu berechnen.
\[°C = (F - 32) \times \frac{5}{9}\]
Um einen character vector in Zahlen umzuwandeln, brauchen wir die Funktion as.numeric. Für die Subtraktion und Multiplikation brauchen wir zur Veranschaulichung die entsprechenden Funktionen subtract und multiply_by aus der Library magrittr.
Übersetzt in R-Code entsteht folgende Operation:
library("magrittr")
out <- as.numeric(temperature) # 1. Konvertierung in Numeric
out <- subtract(out, 32) # 2. Subtraktion von 32
out <- multiply_by(out, 5/9) # 3. Multiplikation mit 5/9
out <- mean(out) # 4. Berechnung des Mittelwertes
out
## [1] 53.33333Möchte man das Zwischenspeichern vermeiden, entsteht eine komplexe, unleserliche Operation
out <- mean(multiply_by(subtract(as.numeric(temperature), 32), 5/9))Um den Code sowohl leserlich zu halten als auch das Abspeichern von Zwischenergebnissen zu vermeiden, kann Piping verwendet werden: Mit “piping” wird der Output der einen Funktion der erste Parameter der darauf folgenden Funktion.
temperature |>
as.numeric() |> # 1. Konvertierung in Numeric
subtract(32) |> # 2. Subtraktion von 32
multiply_by(5/9) |> # 3. Multiplikation mit 5/9
mean() # 4. Berechnung des Mittelwertes
## [1] 53.33333- der
|>Pipe Operator wurde erst in R4.1eingeführt - Neben dem base R Pipe Operator existiert im Package
magrittrein sehr ähnlicher1 Pipe Operator:%>% - Die Tastenkombination Ctrl+Shift+M in RStudio fügt einen Pipe Operator ein.
- Welcher Pipe Operator
|>oder%>%mit der obigen Tastenkombination eingefügt wird, kann über die RStudio SettingsTools→Global Options→Code→ Häkchen setzen beiUse native pipe operator - Wir verwenden die base-R Pipe
|>
Joins
Wie ihr in der Vorlesung gelernt habt, erlauben Joins das Verbinden von Daten in unterschiedichen Tabellen über gemeinsame Schlüsselattribute. Die unterschiedlichen Join-Formen (inner, left, right, full join) bestimmen dabei, wie die Daten verbunden werden sollen. Hier wollen wir die unterschiedlichen Join-Formen in R genauer anschauen:
Wir benutzen dafür dasselbe Beispiel wie in der Vorlesung. Wir wollen den Ortnamen von Studierenden (gespeichert im Dataframe ortschaften) mit verschiedenen Joins via dem Schlüsselattribut PLZ an den Dateframe studierende knüpfen.
studierende <- data.frame(
Matrikel_Nr = c(100002, 100003, 200003),
Studi = c("Patrick", "Manuela", "Eva"),
PLZ = c(8006, 8001, 8820)
)
studierende
## Matrikel_Nr Studi PLZ
## 1 100002 Patrick 8006
## 2 100003 Manuela 8001
## 3 200003 Eva 8820
ortschaften <- data.frame(
PLZ = c(8003, 8006, 8810, 8820),
Ortsname = c("Zürich", "Zürich", "Horgen", "Wädenswil")
)
ortschaften
## PLZ Ortsname
## 1 8003 Zürich
## 2 8006 Zürich
## 3 8810 Horgen
## 4 8820 WädenswilInner Join
# Load library
library("dplyr")
inner_join(studierende, ortschaften, by = "PLZ")
## Matrikel_Nr Studi PLZ Ortsname
## 1 100002 Patrick 8006 Zürich
## 2 200003 Eva 8820 WädenswilLeft Join
left_join(studierende, ortschaften, by = "PLZ")
## Matrikel_Nr Studi PLZ Ortsname
## 1 100002 Patrick 8006 Zürich
## 2 100003 Manuela 8001 <NA>
## 3 200003 Eva 8820 WädenswilRight Join
right_join(studierende, ortschaften, by = "PLZ")
## Matrikel_Nr Studi PLZ Ortsname
## 1 100002 Patrick 8006 Zürich
## 2 200003 Eva 8820 Wädenswil
## 3 NA <NA> 8003 Zürich
## 4 NA <NA> 8810 HorgenFull Join
full_join(studierende, ortschaften, by = "PLZ")
## Matrikel_Nr Studi PLZ Ortsname
## 1 100002 Patrick 8006 Zürich
## 2 100003 Manuela 8001 <NA>
## 3 200003 Eva 8820 Wädenswil
## 4 NA <NA> 8003 Zürich
## 5 NA <NA> 8810 HorgenUnterschiedliche Attributsnamen
Häufig kommt es vor, dass in den Dataframes, welche miteinander verknüpft werden sollen, die Attributsnamen der Schlüsselattribute nicht übereinstimmen. Im obrigen Beispiel heisst das Schlüsselattribut in beiden Dataframes PLZ. Nun heisst im Dataframe studierende das Schlüsselattribut Wohnort.
studierende <- data.frame(
Matrikel_Nr = c(100002, 100003, 200003),
Studi = c("Patrick", "Manuela", "Pascal"),
Wohnort = c(8006, 8001, 8006)
)In R kann dies dann folgendermassen umgesetzt werden:
left_join(studierende, ortschaften, by = c("Wohnort" = "PLZ"))
## Matrikel_Nr Studi Wohnort Ortsname
## 1 100002 Patrick 8006 Zürich
## 2 100003 Manuela 8001 <NA>
## 3 200003 Pascal 8006 Zürich