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()
weather
Wie 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?<- c("jahr", "month", "day", "Wind") vars
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?<- c("jahr", "month", "day", "Wind") vars
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 %>% # durch diesen Operator wird weather in die nächste Funktion übergeben
weather mutate(wind_speed = wind_speed * 1.609344,
wind_gust = wind_gust * 1.609344)
weather
# Derselbe Befehl ohne Pipe:
<- mutate(weather, wind_speed = wind_speed * 1.609344,
weather wind_gust = wind_gust * 1.609344)
<- weather %>%
weather mutate(temp = (temp - 32) / 1.8)
weather
wind_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.