Wie gewohnt soll in diesem Abschnitt ein weiterer Datensatz betrachtet werden.
Der Datensatz weather aus der Bibliothek
nycflights13 beschreibt Wetterdaten aus dem Jahr 2013
bezogen auf drei Flughäfen:
library(nycflights13)
library(tidyverse)Registered S3 methods overwritten by 'dbplyr':
method from
print.tbl_lazy
print.tbl_sql
── Attaching packages ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.2 ──✔ ggplot2 3.3.6 ✔ purrr 0.3.4
✔ tibble 3.1.8 ✔ dplyr 1.0.10
✔ tidyr 1.2.1 ✔ stringr 1.4.1
✔ readr 2.1.3 ✔ forcats 0.5.2 ── Conflicts ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
weatherWie gewohnt erfahren Sie mehr über den Datensatz, wenn Sie
?weather eingeben.
year, month, day,
hour und time_hour zu entnehmen.wind im Namen
haben.temp auszuwählen.
Was stellen Sie fest?any_of() und
all_of() in Bezug zu select() nach. Wie könnte
Ihnen any_of() mit dem folgenden Vektor helfen?vars <- c("jahr", "month", "day", "Wind")select(weather, contains("hOuR"))1,609344).wind_speed und
wind_gust. Welche Information erhalten Sie hieraus?min_rank() Funktion zu verwenden. Überlegen
Sie sich mehrere Wege, dieses Problem anzugehen. Wie handhaben Sie
Einträge mit denselben Rängen (gleiche Windgeschwindigkeit)?origin) die höchste
Temperatur, die höchste Luftfeuchtigkeit und den kleinsten Luftdruck
aus.wind_speed) aus.year,
month, day, hour und
time_hour zu entnehmen.Die Standardmethode:
select(weather, year, month, day, hour, time_hour)Da die Zeiteinträge die zweite bis fünfte Spalte und die letzte Spalte beschreiben, können wir das auch ausnutzen:
select(weather, 2:5, 15)Einträge lassen sich auch gemischt mit Index oder Zahl entnehmen, wenn die Position einer Variable nicht per Hand bestimmt werden soll:
select(weather, 2:5, time_hour)Mit Hilfe von contains() lassen sich auch
hour und time_hour gleichzeitig entnehmen:
select(weather, 2:4, contains("hour"))Mit Hilfe von contains() lassen sich auch die Einträge
entnehmen, die ein "a" oder ein "u" enthalten
und nicht origin sind:
select(weather, contains("a"), contains("o"), -origin)Hinweis: an dieser Stelle würden sich reguläre Expressionen (Zeichenketten filtern/auswählen) anbieten, was wir nicht behandeln wollen.
wind im Namen haben.select(weather, contains("wind"))temp auszuwählen. Was stellen Sie
fest?select(weather, temp, temp, day, temp)Sie sehen, dass sich eine Variable nur einmal entnehmen lässt. Die Position entspricht dann der ersten Nennung der Variablen.
any_of() und all_of() in Bezug
zu select() nach. Wie könnte Ihnen any_of()
mit dem folgenden Vektor helfen?vars <- c("jahr", "month", "day", "Wind")any_of(x): Wähle “irgendwelche von x
aus” aus. Wählt nur die möglichen Variablen aus und lässt fehlende
aus.
all_of(x): Wähle “alle von x aus”. Gibt
eine Fehlermeldung, falls eine Variable aus x nicht
gefunden wird.
# Wähle alle (möglichen) Variablen aus vars aus:
select(weather, any_of(vars))# Wähle alle Variablen aus:
select(weather, all_of(vars))Error in `select()`:
! Can't subset columns that don't exist.
✖ Columns `jahr` and `Wind` don't exist.
Backtrace:
1. dplyr::select(weather, all_of(vars))
2. dplyr:::select.data.frame(weather, all_of(vars))
5. tidyselect::eval_select(expr(c(...)), .data)
6. tidyselect:::eval_select_impl(...)
15. tidyselect:::vars_select_eval(...)
...
18. tidyselect:::reduce_sels(node, data_mask, context_mask, init = init)
19. tidyselect:::walk_data_tree(new, data_mask, context_mask)
20. tidyselect:::as_indices_sel_impl(...)
21. tidyselect:::as_indices_impl(x, vars, call = call, strict = strict)
22. tidyselect:::chr_as_locations(x, vars, call = call)
select(weather, contains("hOuR"))Wir sehen, dass die Groß-und Kleinschreibung von "hOuR"
ignoriert wird. Falls dies beachtet werden soll, muss
ignore.case = FALSE in contains() gesetzt
werden:
select(weather, contains("hOuR", ignore.case = FALSE))1,609344).# Hierbei wird weather aktiv überschrieben, d. h. mit den neuen Werten ersetzt
weather <- weather %>% # durch diesen Operator wird weather in die nächste Funktion übergeben
mutate(wind_speed = wind_speed * 1.609344,
wind_gust = wind_gust * 1.609344)
weather# Derselbe Befehl ohne Pipe:
weather <- mutate(weather, wind_speed = wind_speed * 1.609344,
wind_gust = wind_gust * 1.609344)weather <- weather %>%
mutate(temp = (temp - 32) / 1.8)
weatherwind_speed und wind_gust. Welche
Information erhalten Sie hieraus?Die Variable wind_speed beschreibt die durchschnittliche
Windgeschwindigkeit innerhalb der stündlichen Intervalle. Die Variable
wind_gust hingegen beschreibt die maximale Geschwindigkeit
von Windstößen, welche kurzzeitige, starke Anstiege in der
Windgeschwindigkeit verursachen.
Die Differenz lässt sich wie folgt berechnen:
# Nur die relevanten Spalten werden mit transmute betrachtet:
transmute(weather, wind_speed, wind_gust, wind_diff = wind_gust - wind_speed)Entsprechend erhalten wir hier Information darüber, wie sehr die Geschwindigkeit von Windstöße von dem Durchschnitt abweichen.
Nun ließe sich beispielsweise der Eintrag mit der höchsten Differenz ausfindig machen (sehr starker Windstoß):
weather %>%
mutate(wind_diff = wind_gust - wind_speed) %>%
slice_max(wind_diff)min_rank() Funktion zu verwenden. Überlegen Sie sich
mehrere Wege, dieses Problem anzugehen. Wie handhaben Sie Einträge mit
denselben Rängen (gleiche Windgeschwindigkeit)?Eine Möglichkeit ist die Bestimmung des Rangs von
wind_gust und der anschließenden Filterung nach den ersten
1:15 Einträgen.
weather %>%
mutate(gust_rank = min_rank(desc(wind_gust))) %>%
filter(gust_rank %in% 1:15)Alternativ könnte auch versucht werden, die Einträge absteigend nach
wind_gust zu sortieren und dann die ersten Einträge
auszuwählen:
weather %>%
arrange(desc(wind_gust)) %>%
slice(1:15)Das Problem hierbei ist, dass gleiche Werte nicht beachtet werden, sodass mehrere Beobachtungen mit demselben Wert ignoriert werden.
Eine bessere Alternative mit slice_max():
weather %>%
slice_max(wind_gust, n = 15)origin) die höchste Temperatur, die
höchste Luftfeuchtigkeit und den kleinsten Luftdruck aus.Zuvor wurde gezeigt, dass für Fragestellungen dieser Art eine
Zusammenfassung mit summarise() verwendet wird in
Verbindung mit einer Gruppierung (nach origin):
# Vorsicht: es gibt bei allen Variablen fehlende Werte
weather %>%
group_by(origin) %>%
summarise(max_temp = max(temp, na.rm = TRUE),
max_humid = max(humid, na.rm = TRUE),
min_pressure = min(pressure, na.rm = TRUE))Sie sehen, dass group_by() bewirkt, dass die folgende
summarise() Funktion auf jeden Flughafen
(origin) separat die einzelnen Werte berechnet. In
summarise() werden die Werte zusammengefasst, indem ein
neuer Variablenname angegeben wird, welcher beispielsweise dem Minimum
min() oder dem Maximum max() einer vorherigen
Variablen entspricht.
wind_speed) aus.Hierbei müssen Sie beachten, dass Sie für das Datum gemäß Jahr, Monat und Tag gruppieren müssen:
weather %>%
group_by(year, month, day) %>%
summarise(avg_speed = mean(wind_speed))`summarise()` has grouped output by 'year', 'month'. You can override using the `.groups` argument.