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