16.4 Operace nad sloupci

Funkce z balíku dplyr umožňují spouštět funkce nad specifikovanými sloupci tabulky. Prvním příkladem užití takové funkcionality může být výběr sloupců určitého datového typu:

planes %>% 
  select(where(is.character))
## # A tibble: 3,322 × 5
##    tailnum type                    manufacturer     model     engine   
##    <chr>   <chr>                   <chr>            <chr>     <chr>    
##  1 N10156  Fixed wing multi engine EMBRAER          EMB-145XR Turbo-fan
##  2 N102UW  Fixed wing multi engine AIRBUS INDUSTRIE A320-214  Turbo-fan
##  3 N103US  Fixed wing multi engine AIRBUS INDUSTRIE A320-214  Turbo-fan
##  4 N104UW  Fixed wing multi engine AIRBUS INDUSTRIE A320-214  Turbo-fan
##  5 N10575  Fixed wing multi engine EMBRAER          EMB-145LR Turbo-fan
##  6 N105UW  Fixed wing multi engine AIRBUS INDUSTRIE A320-214  Turbo-fan
##  7 N107US  Fixed wing multi engine AIRBUS INDUSTRIE A320-214  Turbo-fan
##  8 N108UW  Fixed wing multi engine AIRBUS INDUSTRIE A320-214  Turbo-fan
##  9 N109UW  Fixed wing multi engine AIRBUS INDUSTRIE A320-214  Turbo-fan
## 10 N110UW  Fixed wing multi engine AIRBUS INDUSTRIE A320-214  Turbo-fan
## # … with 3,312 more rows

Výběr byl proveden s použitím dodatečné select-helper funce where(). Do té byl vložen výraz, který byl vyhodnocen nad sloupci tabulky. Výsledek, logický vektor, byl potom použit pro výběr funkcí select().

Všiměte si, že funkce is.character() je v příkladu použita bez závorek. Parametrem where() je totiž funkce samotná a nikoliv její výstup.

dplyr umožňuje uživateli provádět i sofistikovanější operace – typicky modifikovat sloupce, které splňují určitou podmínku. Můžeme například chtít konvertovat číselné sloupce na character. Pro tyto účely slouží funkce across(). Ta má dva vstupy: (a) výraz, který identifikuje sloupce, které se mají modifikovat, a (b) výraz, který se má pro samotnou modifikaci použít. řešení by mohlo vypadat následujícím způsobem:

planes %>% 
  mutate(
    across(
      where(is.numeric),
      as.character
    )
  )
## # A tibble: 3,322 × 9
##    tailnum year  type          manufacturer   model  engines seats speed engine 
##    <chr>   <chr> <chr>         <chr>          <chr>  <chr>   <chr> <chr> <chr>  
##  1 N10156  2004  Fixed wing m… EMBRAER        EMB-1… 2       55    <NA>  Turbo-…
##  2 N102UW  1998  Fixed wing m… AIRBUS INDUST… A320-… 2       182   <NA>  Turbo-…
##  3 N103US  1999  Fixed wing m… AIRBUS INDUST… A320-… 2       182   <NA>  Turbo-…
##  4 N104UW  1999  Fixed wing m… AIRBUS INDUST… A320-… 2       182   <NA>  Turbo-…
##  5 N10575  2002  Fixed wing m… EMBRAER        EMB-1… 2       55    <NA>  Turbo-…
##  6 N105UW  1999  Fixed wing m… AIRBUS INDUST… A320-… 2       182   <NA>  Turbo-…
##  7 N107US  1999  Fixed wing m… AIRBUS INDUST… A320-… 2       182   <NA>  Turbo-…
##  8 N108UW  1999  Fixed wing m… AIRBUS INDUST… A320-… 2       182   <NA>  Turbo-…
##  9 N109UW  1999  Fixed wing m… AIRBUS INDUST… A320-… 2       182   <NA>  Turbo-…
## 10 N110UW  1999  Fixed wing m… AIRBUS INDUST… A320-… 2       182   <NA>  Turbo-…
## # … with 3,312 more rows

Funkce across() funguje výborně s funkcemi jako je mutate() nebo summarise(). V dplyr 1.0.4 přibyly nové funkce, které jsou navženy tak, aby podobným způsobem umožnili pracovat s filter(). Jde o if_any() a if_all(). Jejich syntaxe a parametry jsou stejné jako u across(), ale na ro rozdíl od across() vracejí logický vektor, který je požadovaným vstupem funkce filter().

Následující příklad ukazuje, jak řešit obyvklý problém v datové analýze – někde nám utíkají pozorování, protože některé řádky v nějakém sloupci obsahují NA. Funkce if_any() nám umožňuje takové řádky lehce najít:

planes %>% 
  filter(
    if_any(
      everything(), # tj. hledej ve všech sloupcích
      is.na
      )
    )
## # A tibble: 3,299 × 9
##    tailnum  year type          manufacturer   model  engines seats speed engine 
##    <chr>   <int> <chr>         <chr>          <chr>    <int> <int> <int> <chr>  
##  1 N10156   2004 Fixed wing m… EMBRAER        EMB-1…       2    55    NA Turbo-…
##  2 N102UW   1998 Fixed wing m… AIRBUS INDUST… A320-…       2   182    NA Turbo-…
##  3 N103US   1999 Fixed wing m… AIRBUS INDUST… A320-…       2   182    NA Turbo-…
##  4 N104UW   1999 Fixed wing m… AIRBUS INDUST… A320-…       2   182    NA Turbo-…
##  5 N10575   2002 Fixed wing m… EMBRAER        EMB-1…       2    55    NA Turbo-…
##  6 N105UW   1999 Fixed wing m… AIRBUS INDUST… A320-…       2   182    NA Turbo-…
##  7 N107US   1999 Fixed wing m… AIRBUS INDUST… A320-…       2   182    NA Turbo-…
##  8 N108UW   1999 Fixed wing m… AIRBUS INDUST… A320-…       2   182    NA Turbo-…
##  9 N109UW   1999 Fixed wing m… AIRBUS INDUST… A320-…       2   182    NA Turbo-…
## 10 N110UW   1999 Fixed wing m… AIRBUS INDUST… A320-…       2   182    NA Turbo-…
## # … with 3,289 more rows

Funkce across(), where(), if_any() a if_all() nahrazují tzv. scoped varianty základních funkcí ze starších verzí dplyr.