<- c("111", "150", "123") temperature
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")
<- 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
out## [1] 53.33333
Möchte man das Zwischenspeichern vermeiden, entsteht eine komplexe, unleserliche Operation
<- mean(multiply_by(subtract(as.numeric(temperature), 32), 5/9)) out
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.1
eingeführt - Neben dem base R Pipe Operator existiert im Package
magrittr
ein 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.
<- data.frame(
studierende 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
<- data.frame(
ortschaften 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ädenswil
Inner 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ädenswil
Left 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ädenswil
Right 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 Horgen
Full 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 Horgen
Unterschiedliche 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
.
<- data.frame(
studierende 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