Читать книгу R für Data Science - Hadley Wickham - Страница 68

Nützliche Zusammenfassungsfunktionen

Оглавление

Allein mit Mittelwerten, Zählern und Summen kommen Sie möglicherweise schon recht weit, doch R bietet noch viele andere nützliche Zusammenfassungsfunktionen:

Lagemaße

Außer dem bisher schon verwendeten Mittelwert mean(x) liefert der Median (median()) ebenfalls ein nützliches Maß. Der Mittelwert ist die Summe dividiert durch die Länge; der Median ist der Wert, bei dem 50% von x oberhalb und 50% unterhalb liegen.

Manchmal ist es zweckmäßig, Aggregation mit logischer Teilgruppenbildung zu kombinieren. Über diese Art der Teilgruppenbildung haben wir zwar noch nicht gesprochen, doch im Abschnitt »Teilgruppen« auf Seite 279 lernen Sie mehr darüber.

not_cancelled %>%

group_by(year, month, day) %>%

summarize(

# average delay:

avg_delay1 = mean(arr_delay),

# average positive delay:

avg_delay2 = mean(arr_delay[arr_delay > 0])

)

#> Source: local data frame [365 x 5]

#> Groups: year, month [?]

#>

#> year month day avg_delay1 avg_delay2

#> <int> <int> <int> <dbl> <dbl>

#> 1 2013 1 1 12.65 32.5

#> 2 2013 1 2 12.69 32.0

#> 3 2013 1 3 5.73 27.7

#> 4 2013 1 4 -1.93 28.3

#> 5 2013 1 5 -1.53 22.6

#> 6 2013 1 6 4.24 24.4

#> # ... with 359 more rows

Streuungsmaße sd(), IQR(), mad()

Die mittlere quadratische Abweichung oder Standardabweichung (sd(), standard deviation) ist das standardmäßige Streuungsmaß schlechthin. Der Interquartilsabstand (IQR(), interquartile range) und der Median der absoluten Abweichung (mad(), median absolute deviation) sind robuste Äquivalente, die insbesondere dann zweckmäßig sind, wenn in der Stichprobe Ausreißer vorkommen:

# Why is distance to some destinations more variable

# than to others?

not_cancelled %>%

group_by(dest) %>%

summarize(distance_sd = sd(distance)) %>%

arrange(desc(distance_sd))

#> # A tibble: 104 × 2

#> dest distance_sd

#> <chr> <dbl>

#> 1 EGE 10.54

#> 2 SAN 10.35

#> 3 SFO 10.22

#> 4 HNL 10.00

#> 5 SEA 9.98

#> 6 LAS 9.91

#> # ... with 98 more rows

Rangmaße min(), quantile(), max()

Quantile sind eine Verallgemeinerung des Medians. Zum Beispiel ermittelt quantile(x, 0.25) einen Wert von x, der größer als 25% der Werte und kleiner als die restlichen 75% ist.

# When do the first and last flights leave each day?

not_cancelled %>%

group_by(year, month, day) %>%

summarize(

first = min(dep_time),

last = max(dep_time)

)

#> Source: local data frame [365 x 5]

#> Groups: year, month [?]

#>

#> year month day first last

#> <int> <int> <int> <int> <int>

#> 1 2013 1 1 517 2356

#> 2 2013 1 2 42 2354

#> 3 2013 1 3 32 2349

#> 4 2013 1 4 25 2358

#> 5 2013 1 5 14 2357

#> 6 2013 1 6 16 2355

#> # ... with 359 more rows

Positionsmaße first(), nth(), last(x)

Diese Funktionen arbeiten ähnlich wie x[1], x[2] und x[length(x)], erlauben aber, einen Standardwert für den Fall festzulegen, dass diese Position nicht existiert (wenn Sie etwa versuchen, das dritte Element aus einer Gruppe zu finden, die nur zwei Elemente enthält). Der Code im folgenden Beispiel sucht den ersten und letzten Abflug für jeden Tag:

not_cancelled %>%

group_by(year, month, day) %>%

summarize(

first_dep = first(dep_time),

last_dep = last(dep_time)

)

#> Source: local data frame [365 x 5]

#> Groups: year, month [?]

#>

#> year month day first_dep last_dep

#> <int> <int> <int> <int> <int>

#> 1 2013 1 1 517 2356

#> 2 2013 1 2 42 2354

#> 3 2013 1 3 32 2349

#> 4 2013 1 4 25 2358

#> 5 2013 1 5 14 2357

#> 6 2013 1 6 16 2355

#> # ... with 359 more rows

Diese Funktionen ergänzen das Filtern nach Rängen. Filtern liefert alle Variablen, wobei jede Beobachtung in einer eigenen Zeile steht:

not_cancelled %>%

group_by(year, month, day) %>%

mutate(r = min_rank(desc(dep_time))) %>%

filter(r %in% range(r))

#> Source: local data frame [770 x 20]

#> Groups: year, month, day [365]

#>

#> year month day dep_time sched_dep_time dep_delay

#> <int> <int> <int> <int> <int> <dbl>

#> 1 2013 1 1 517 515 2

#> 2 2013 1 1 2356 2359 -3

#> 3 2013 1 2 42 2359 43

#> 4 2013 1 2 2354 2359 -5

#> 5 2013 1 3 32 2359 33

#> 6 2013 1 3 2349 2359 -10

#> # ... with 764 more rows, and 13 more variables:

#> # arr_time <int>, sched_arr_time <int>,

#> # arr_delay <dbl>, carrier <chr>, flight <int>,

#> # tailnum <chr>, origin <chr>, dest <chr>,

#> # air_time <dbl>, distance <dbl>, hour <dbl>,

#> # minute <dbl>, time_hour <dttm>, r <int>

Zähler

Sie kennen bereits die Funktion n(), die keine Argumente übernimmt und die Größe der aktuellen Gruppe zurückgibt. Mit sum(!is.na(x)) zählen Sie die Anzahl der nicht fehlenden Werte. Um die eindeutigen (einzigartigen) Werte zu ermitteln, verwenden Sie n_distinct(x):

# Which destinations have the most carriers?

not_cancelled %>%

group_by(dest) %>%

summarize(carriers = n_distinct(carrier)) %>%

arrange(desc(carriers))

#> # A tibble: 104 × 2

#> dest carriers

#> <chr> <int>

#> 1 ATL 7

#> 2 BOS 7

#> 3 CLT 7

#> 4 ORD 7

#> 5 TPA 7

#> 6 AUS 6

#> # ... with 98 more rows

Da Zähler so nützlich sind, bietet dplyr eine einfache Hilfsfunktion für den Fall, dass Sie lediglich einen Zählerwert brauchen:

not_cancelled %>%

count(dest)

#> # A tibble: 104 × 2

#> dest n

#> <chr> <int>

#> 1 ABQ 254

#> 2 ACK 264

#> 3 ALB 418

#> 4 ANC 8

#> 5 ATL 16837

#> 6 AUS 2411

#> # ... with 98 more rows

Optional können Sie eine Gewichtsvariable angeben. Zum Beispiel könnten Sie auf diese Weise die Gesamtanzahl der von einem Flugzeug zurückgelegten Meilen »zählen« (das heißt summieren):

not_cancelled %>%

count(tailnum, wt = distance)

#> # A tibble: 4,037 × 2

#> tailnum n

#> <chr> <dbl>

#> 1 D942DN 3418

#> 2 N0EGMQ 239143

#> 3 N10156 109664

#> 4 N102UW 25722

#> 5 N103US 24619

#> 6 N104UW 24616

#> # ... with 4,031 more rows

Anzahlen und Anteile von logischen Werten sum(), mean()

In Verbindung mit numerischen Funktionen wird TRUE als 1 ausgewertet und FALSE als 0. Dadurch sind sum() und mean() sehr nützlich: sum(x) liefert die Anzahl der TRUE-Werte in x und mean(x) gibt den Anteil zurück:

# How many flights left before 5am? (these usually

# indicate delayed flights from the previous day)

not_cancelled %>%

group_by(year, month, day) %>%

summarize(n_early = sum(dep_time < 500))

#> Source: local data frame [365 x 4]

#> Groups: year, month [?]

#>

#> year month day n_early

#> <int> <int> <int> <int>

#> 1 2013 1 1 0

#> 2 2013 1 2 3

#> 3 2013 1 3 4

#> 4 2013 1 4 3

#> 5 2013 1 5 3

#> 6 2013 1 6 2

#> # ... with 359 more rows

# What proportion of flights are delayed by more

# than an hour?

not_cancelled %>%

group_by(year, month, day) %>%

summarize(hour_perc = mean(arr_delay > 60))

#> Source: local data frame [365 x 4]

#> Groups: year, month [?]

#>

#> year month day hour_perc

#> <int> <int> <int> <dbl>

#> 1 2013 1 1 0.0722

#> 2 2013 1 2 0.0851

#> 3 2013 1 3 0.0567

#> 4 2013 1 4 0.0396

#> 5 2013 1 5 0.0349

#> 6 2013 1 6 0.0470

#> # ... with 359 more rows

R für Data Science

Подняться наверх