10  Práce se sloupci

První dimenzí dataframu jsou sloupce, reprezentující zpravidla naše proměnné. Pro práci se sloupci nabízí Tidyverse šikovnou funkci select() a pár jejích příbuzných. V této kapitole si ukážeme, jak efektivně vybírat sloupce v dataframu, přejmenovávat je a řadit podle našich přání.

10.1 Výběr sloupců

Předmětem analýzy v mnoha případech není celý dataframe, ale pouze jeho výsek. Základní aplikace již zmíněné funkce select() je přímočará. Prvním argumentem je dataframe, který chceme filtrovat, zbylými sloupce, které chceme zachovat:

select(countries, country, life_exp, postsoviet)
# A tibble: 38 × 3
   country  life_exp postsoviet
   <chr>       <dbl> <chr>     
 1 Belgium      81.2 no        
 2 Bulgaria     74.8 yes       
 3 Czechia      79.2 yes       
 4 Denmark      81.2 no        
 5 Germany      81   yes       
 6 Estonia      77.8 yes       
 7 Ireland      81.5 no        
 8 Greece       81.2 no        
 9 Spain        83.1 no        
10 France       82.9 no        
# ℹ 28 more rows

Pokud by naším cílem bylo se některého sloupce zbavit, využijeme mínusu (-), podobně jako u indexování (viz. Sekce 6.3 ). Pro vyřazení více sloupců využijeme již dobře známou funkci c():

select(countries, -c(country, life_exp, postsoviet))
# A tibble: 38 × 14
   code       gdp population   area eu_member uni_prc poverty_risk material_dep
   <chr>    <dbl>      <dbl>  <dbl> <chr>       <dbl>        <dbl>        <dbl>
 1 BE     450506.   11398589  30528 yes         0.36         0.203        0.113
 2 BG      55182.    7050034 110879 yes         0.248        0.389        0.438
 3 CZ     207772.   10610055  78867 yes         0.217        0.122        0.098
 4 DK     298276.    5781190  43094 yes         0.327        0.172        0.068
 5 DE    3386000    82792351 357022 yes         0.252        0.19         0.091
 6 EE      25657.    1319133  45228 yes         0.359        0.234        0.116
 7 IE     324038.    4830392  70273 yes         0.405        0.227        0.148
 8 GR     184714.   10741165 131957 yes         0.277        0.348        0.36 
 9 ES    1208248    46658447 505370 yes         0.34         0.266        0.128
10 FR    2353090    66926166 643801 yes         0.328        0.171        0.111
# ℹ 28 more rows
# ℹ 6 more variables: hdi <dbl>, foundation_date <date>, maj_belief <chr>,
#   dem_index <dbl>, di_cat <chr>, hd_title_name <chr>

10.2 Pomocné funkce

Ručně vypisovat všechny proměnné, které chceme vybrat, je u větších dataframů zdlouhavá činnost. Naštěstí pro nás obsahuje balíček dplyr řadu pomocných funkcí (selection helpers).

Nejzákladnější pomocnou funkcí je :, která vybere všechny sloupce v rozpětí. Například, pro vybrání country, area a všech proměnných mezi nimi:

select(countries, country:area)

Pokud chceme vybrat všechny proměnné v dataframu, nemusíme využívat :, stačí využít funkci everything(). Možnost vybrat úplně všechny proměnné se nemusí zdát na první pohled užitečná, nachází ale často využití při převodu dat mezi širokým a dlouhým formátem (viz. níže).

Sadou užitečných pomocných funkcí jsou starts_with(), ends_with() a contains(). Funkce starts_with() vybere všechny sloupce začínající stejnými znaky, ends_with() naopak všechny sloupce končící stejně. contains() identifikuje sloupce, jejichž název obsahuje specifikovaný řetězec znaků. Například pro vybrání všech proměnných, jejichž název obsahuje podtržítko:

select(countries, contains("_"))

Poslední pomocnou funkcí, kterou si zde ukážeme, je where(). Pomocí ní lze vybrat všechny sloupce splňující danou logickou podmínku. Pro vybrání všech numerických proměnných:

select(countries, where(is.numeric))

Analogicky by bylo možné aplikovat funkce is.character, is.factor nebo is.logical. Tyto funkce jsou uvnitř where() použity bez závorek.

Dokumentace k pomocným funkcím je dostupná pomocí help("tidyr_tidy_select").

10.3 Přejmenovávání proměnných

Ne vždy budeme spokojeni s tím, jak jsou naše proměnné pojmenované. Způsobů, jak proměnnou přejmenovat je řada, preferovanou metodou v v rámci Tidyverse je využít funkci rename(). Její aplikace je jednoduchá, nové jméno je vždy specifikované ve formátu nove_jmeno = stare_jmeno. Pokud by se nám například nelíbilo jméno proměnné uni_prc, můžeme ho změnit na výstižnější university_educated. Tady poprvé narážíme na řetězení funcí pomocí pipes, představených v kapitole věnované funkcím (Sekce 6.4):

countries %>% 
  rename(university_educated = uni_prc) %>% 
  select(country, university_educated)
# A tibble: 38 × 2
   country  university_educated
   <chr>                  <dbl>
 1 Belgium                0.36 
 2 Bulgaria               0.248
 3 Czechia                0.217
 4 Denmark                0.327
 5 Germany                0.252
 6 Estonia                0.359
 7 Ireland                0.405
 8 Greece                 0.277
 9 Spain                  0.34 
10 France                 0.328
# ℹ 28 more rows

Dataframe countries již není obsažen ve funkci filter(), ale je do ní poslán skrze pipe (%>%). Vzpomeňme si, že pipe vezme objekt na její levé straně a vloží ho do prvního argumentu funkce napravo.

O něco komplexnější funkcí je rename_with(). Ta umožňuje přejmenovávat proměnné funkce programátorsky. Co kdybychom například chtěli převést názvy proměnných ze snake_case na kebab-case? Jediné, co pro to musíme udělat je změnit podtržítka v názvech proměnných na pomlčky. Jednou možností by bylo ručně přepsat názvy všech proměnných. Efektivnější variantou je využít funkce rename_with() v kombinaci s funkcí str_replace():

countries %>% 
  rename_with(str_replace, pattern = "_", replacement = "-") %>% 
  select(country, contains("-"))
# A tibble: 38 × 11
   country  `eu-member` `life-exp` `uni-prc` `poverty-risk` `material-dep`
   <chr>    <chr>            <dbl>     <dbl>          <dbl>          <dbl>
 1 Belgium  yes               81.2     0.36           0.203          0.113
 2 Bulgaria yes               74.8     0.248          0.389          0.438
 3 Czechia  yes               79.2     0.217          0.122          0.098
 4 Denmark  yes               81.2     0.327          0.172          0.068
 5 Germany  yes               81       0.252          0.19           0.091
 6 Estonia  yes               77.8     0.359          0.234          0.116
 7 Ireland  yes               81.5     0.405          0.227          0.148
 8 Greece   yes               81.2     0.277          0.348          0.36 
 9 Spain    yes               83.1     0.34           0.266          0.128
10 France   yes               82.9     0.328          0.171          0.111
# ℹ 28 more rows
# ℹ 5 more variables: `foundation-date` <date>, `maj-belief` <chr>,
#   `dem-index` <dbl>, `di-cat` <chr>, `hd-title_name` <chr>

10.4 Pořadí proměnných

Pořadí proměnných v dataframu je možné upravovat pomocí funkce relocate(). Tu je možné využít pro jednotlivé proměnné i v kombinaci s pomocnými funkcemi. Pomocí argumentů .before a .after je možné určit novu pozici nových sloupců. Pokud bychom chtěli oddělit numerické proměnné od kategoriálních, využijeme následující kombinací funkcí:

relocate(countries, where(is.numeric), .after = last_col())
# A tibble: 38 × 17
   country  code  eu_member postsoviet foundation_date maj_belief    di_cat     
   <chr>    <chr> <chr>     <chr>      <date>          <chr>         <chr>      
 1 Belgium  BE    yes       no         1831-07-21      catholic      Flawed dem…
 2 Bulgaria BG    yes       yes        1989-11-10      orthodox      Flawed dem…
 3 Czechia  CZ    yes       yes        1993-01-01      nonbelief     Flawed dem…
 4 Denmark  DK    yes       no         2053-05-19      protestantism Full democ…
 5 Germany  DE    yes       yes        1949-05-23      catholic      Full democ…
 6 Estonia  EE    yes       yes        1918-02-24      nonbelief     Flawed dem…
 7 Ireland  IE    yes       no         1937-12-29      catholic      Full democ…
 8 Greece   GR    yes       no         1975-11-19      orthodox      Flawed dem…
 9 Spain    ES    yes       no         1978-12-06      catholic      Full democ…
10 France   FR    yes       no         1958-10-05      catholic      Flawed dem…
# ℹ 28 more rows
# ℹ 10 more variables: hd_title_name <chr>, gdp <dbl>, population <dbl>,
#   area <dbl>, life_exp <dbl>, uni_prc <dbl>, poverty_risk <dbl>,
#   material_dep <dbl>, hdi <dbl>, dem_index <dbl>