16.5 do()
anything
do()
je zvláštní funkce, která umožňuje nad tabulkou provádět různé výpočty a výsledné objekty ukládat do speciální tabulky. Její využití má smysl zejména u zgrupovaných tabulek a používá se například pro odhady ekonometrických modelů pro různá vzorky dat (například pro každou zemi zvlášť) – více viz kapitola věnovaná ekonometrii v R.
V tento okamžik je možné demonstrovat použití do()
na méně komplikovaném případě:
planes %>%
group_by(manufacturer) %>%
do(results = summarise(.,
min_seats = min(seats, na.rm = TRUE),
mean_seats = mean(seats, na.rm = TRUE),
max_seats = max(seats, na.rm = TRUE)
)
)
## # A tibble: 35 x 2
## # Rowwise:
## manufacturer results
## <chr> <list>
## 1 AGUSTA SPA <tibble [1 × 3]>
## 2 AIRBUS <tibble [1 × 3]>
## 3 AIRBUS INDUSTRIE <tibble [1 × 3]>
## 4 AMERICAN AIRCRAFT INC <tibble [1 × 3]>
## 5 AVIAT AIRCRAFT INC <tibble [1 × 3]>
## 6 AVIONS MARCEL DASSAULT <tibble [1 × 3]>
## 7 BARKER JACK L <tibble [1 × 3]>
## 8 BEECH <tibble [1 × 3]>
## 9 BELL <tibble [1 × 3]>
## 10 BOEING <tibble [1 × 3]>
## # … with 25 more rows
do()
je zde použito pro provedení agregace z výše uvedeného příkladu. Pro letadla od každého výrobce je vytvořena tabulka s minimálním, průměrným a maximálním počtem sedadel. Tyto tabulky jsou následně uloženy ve sloupci results
. Z původní tabulky přitom zůstaly pouze sloupce použité pro grupování. V tomto případě pouze jeden sloupec manufacturer
.
Sloupec results
potom obsahuje vektor tabulek (často také seznamů), které mohou být dále zpracovávány. (Právě v takových případech se často uplatní právě rowwise()
.) V případě, že se však jedná o tabulky, je možné výstupní tabulku transformovat do srozumitelnější podoby pomocí nástrojů z balíku tidyr
. Ve své podstatě se totiž jedná o nested tabulku:
planes %>%
group_by(manufacturer) %>%
do(results = summarise(.,
min_seats = min(seats, na.rm = TRUE),
mean_seats = mean(seats, na.rm = TRUE),
max_seats = max(seats, na.rm = TRUE)
)
) %>%
unnest(results)
## # A tibble: 35 x 4
## manufacturer min_seats mean_seats max_seats
## <chr> <int> <dbl> <int>
## 1 AGUSTA SPA 8 8 8
## 2 AIRBUS 100 221. 379
## 3 AIRBUS INDUSTRIE 145 187. 379
## 4 AMERICAN AIRCRAFT INC 2 2 2
## 5 AVIAT AIRCRAFT INC 2 2 2
## 6 AVIONS MARCEL DASSAULT 12 12 12
## 7 BARKER JACK L 2 2 2
## 8 BEECH 9 9.5 10
## 9 BELL 5 8 11
## 10 BOEING 100 175. 450
## # … with 25 more rows
16.5.1 Poznámka
V budoucích vydáních dplyr bude velmi pravděpodobně funkce do()
nahrazena rodinou funkcí group_map()
, group_modify()
a group_walk()
. Ty jsou zatím pouze v experimentální fázi vývoje.