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        
# … with 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 popul…¹   area eu_me…² uni_prc pover…³ mater…⁴   hdi foundati…⁵
   <chr>   <dbl>   <dbl>  <dbl> <chr>     <dbl>   <dbl>   <dbl> <dbl> <date>    
 1 BE     4.51e5  1.14e7  30528 yes       0.36    0.203   0.113  0.92 1831-07-21
 2 BG     5.52e4  7.05e6 110879 yes       0.248   0.389   0.438  0.81 1989-11-10
 3 CZ     2.08e5  1.06e7  78867 yes       0.217   0.122   0.098  0.89 1993-01-01
 4 DK     2.98e5  5.78e6  43094 yes       0.327   0.172   0.068  0.93 2053-05-19
 5 DE     3.39e6  8.28e7 357022 yes       0.252   0.19    0.091  0.94 1949-05-23
 6 EE     2.57e4  1.32e6  45228 yes       0.359   0.234   0.116  0.87 1918-02-24
 7 IE     3.24e5  4.83e6  70273 yes       0.405   0.227   0.148  0.94 1937-12-29
 8 GR     1.85e5  1.07e7 131957 yes       0.277   0.348   0.36   0.87 1975-11-19
 9 ES     1.21e6  4.67e7 505370 yes       0.34    0.266   0.128  0.89 1978-12-06
10 FR     2.35e6  6.69e7 643801 yes       0.328   0.171   0.111  0.9  1958-10-05
# … with 28 more rows, 4 more variables: maj_belief <chr>, dem_index <dbl>,
#   di_cat <chr>, hd_title_name <chr>, and abbreviated variable names
#   ¹​population, ²​eu_member, ³​poverty_risk, ⁴​material_dep, ⁵​foundation_date

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
# … with 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-memb…¹ life-…² uni-p…³ pover…⁴ mater…⁵ foundati…⁶ maj-b…⁷ dem-i…⁸
   <chr>    <chr>       <dbl>   <dbl>   <dbl>   <dbl> <date>     <chr>     <dbl>
 1 Belgium  yes          81.2   0.36    0.203   0.113 1831-07-21 cathol…    7.78
 2 Bulgaria yes          74.8   0.248   0.389   0.438 1989-11-10 orthod…    7.03
 3 Czechia  yes          79.2   0.217   0.122   0.098 1993-01-01 nonbel…    7.69
 4 Denmark  yes          81.2   0.327   0.172   0.068 2053-05-19 protes…    9.22
 5 Germany  yes          81     0.252   0.19    0.091 1949-05-23 cathol…    8.68
 6 Estonia  yes          77.8   0.359   0.234   0.116 1918-02-24 nonbel…    7.97
 7 Ireland  yes          81.5   0.405   0.227   0.148 1937-12-29 cathol…    9.15
 8 Greece   yes          81.2   0.277   0.348   0.36  1975-11-19 orthod…    7.29
 9 Spain    yes          83.1   0.34    0.266   0.128 1978-12-06 cathol…    8.08
10 France   yes          82.9   0.328   0.171   0.111 1958-10-05 cathol…    7.8 
# … with 28 more rows, 2 more variables: `di-cat` <chr>, `hd-title_name` <chr>,
#   and abbreviated variable names ¹​`eu-member`, ²​`life-exp`, ³​`uni-prc`,
#   ⁴​`poverty-risk`, ⁵​`material-dep`, ⁶​`foundation-date`, ⁷​`maj-belief`,
#   ⁸​`dem-index`

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 foundatio…¹ maj_b…² di_cat hd_ti…³    gdp
   <chr>    <chr> <chr>     <chr>      <date>      <chr>   <chr>  <chr>    <dbl>
 1 Belgium  BE    yes       no         1831-07-21  cathol… Flawe… King -… 4.51e5
 2 Bulgaria BG    yes       yes        1989-11-10  orthod… Flawe… Presid… 5.52e4
 3 Czechia  CZ    yes       yes        1993-01-01  nonbel… Flawe… Presid… 2.08e5
 4 Denmark  DK    yes       no         2053-05-19  protes… Full … Queen … 2.98e5
 5 Germany  DE    yes       yes        1949-05-23  cathol… Full … Presid… 3.39e6
 6 Estonia  EE    yes       yes        1918-02-24  nonbel… Flawe… Presid… 2.57e4
 7 Ireland  IE    yes       no         1937-12-29  cathol… Full … Presid… 3.24e5
 8 Greece   GR    yes       no         1975-11-19  orthod… Flawe… Presid… 1.85e5
 9 Spain    ES    yes       no         1978-12-06  cathol… Full … King -… 1.21e6
10 France   FR    yes       no         1958-10-05  cathol… Flawe… Presid… 2.35e6
# … with 28 more rows, 8 more variables: population <dbl>, area <dbl>,
#   life_exp <dbl>, uni_prc <dbl>, poverty_risk <dbl>, material_dep <dbl>,
#   hdi <dbl>, dem_index <dbl>, and abbreviated variable names
#   ¹​foundation_date, ²​maj_belief, ³​hd_title_name