Читать книгу R für Data Science - Hadley Wickham - Страница 65
Mehrere Operationen mit der Pipe kombinieren
ОглавлениеAngenommen, wir wollen die Beziehung zwischen der Entfernung und der durchschnittlichen Verspätung für jeden Ort untersuchen. Mit Ihren Kenntnissen zu dplyr würden Sie vielleicht folgenden Code schreiben:
by_dest <- group_by(flights, dest)
delay <- summarize(by_dest,
count = n(),
dist = mean(distance, na.rm = TRUE),
delay = mean(arr_delay, na.rm = TRUE)
)
delay <- filter(delay, count > 20, dest != "HNL")
# It looks like delays increase with distance up to ~750 miles
# and then decrease. Maybe as flights get longer there's more
# ability to make up delays in the air?
ggplot(data = delay, mapping = aes(x = dist, y = delay)) +
geom_point(aes(size = count), alpha = 1/3) +
geom_smooth(se = FALSE)
#> `geom_smooth()` using method = 'loess'
Diese Daten bereiten Sie in drei Schritten vor:
1 Gruppieren der Flüge nach Ziel.
2 Summieren, um Entfernung, durchschnittliche Verspätung und Anzahl der Flüge zu berechnen.
3 Filtern, um störende Punkte und den Flughafen Honolulu zu entfernen, der fast doppelt so weit entfernt ist wie der nächste Flughafen.
Dieser Code ist recht mühselig zu schreiben, weil wir jedem Zwischen-Dataframe einen Namen geben müssen, selbst wenn wir diese Namen gar nicht brauchen. Die Namensvergabe ist nicht immer einfach und bremst nur unsere Analyse.
Das gleiche Problem lässt sich aber auch mit einer sogenannten Pipe (%>%) angehen:
delays <- flights %>%
group_by(dest) %>%
summarize(
count = n(),
dist = mean(distance, na.rm = TRUE),
delay = mean(arr_delay, na.rm = TRUE)
) %>%
filter(count > 20, dest != "HNL")
Dieser Code konzentriert sich auf die Transformationen und nicht auf das, was transformiert wird, wodurch der Code leichter zu lesen ist. Die Anweisungen können Sie als Folge von Aufforderungen lesen: gruppieren, dann summieren, dann filtern! Somit können Sie die Zeichenfolge %>% beim Lesen von Code als »dann« aussprechen.
Hinter den Kulissen fließt x %>% f(y) in f(x, y) ein, x %>% f(y) %>% g(z) in g(f(x, y), z) und so weiter. Mit der Pipe-Schreibweise lassen sich nun mehrere Operationen in einer Weise neu formulieren, sodass Sie sie von links nach rechts und von oben nach unten lesen können. Wir verwenden die Pipe-Konstruktion häufig, weil sie die Lesbarkeit von Code erheblich verbessert. In Kapitel 14 kommen wir ausführlich darauf zurück.
Das Arbeiten mit Pipes ist eines der Schlüsselkriterien, um zum Tidyverse zu gehören. Die einzige Ausnahme ist ggplot2: Dieses Paket wurde geschrieben, bevor man die Pipe entdeckt hat. Leider ist die nächste Iteration von ggplot2, das Paket ggvis, das die Pipe verwendet, noch nicht für seinen großen Auftritt bereit.