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.