2 Вступ у Tidyverse


2.1 Tidy-всесвіт


Tidyverse — це екосистема, набір пакетів, які спеціально створені для науки про дані (data science). В ньому є ключові пакети (ядро tidyverse) та побічні — які додатково розширюють можливості мови програмування R.

Концепція охайних даних (tidy-data) передбачає приведення даних до формату, в якому:

  • Кожна змінна міститься в окремому стовпчику

  • Кожне спостереження міститься в окремому рядку

  • Кожне значення міститься в окремій комірці

Ядро tidyverse:

  • ggplot2, для візуалізації

  • dplyr, для маніпуляції з даними

  • tidyr, для отримання охайних даних (tidy data)

  • readr, для зчитування та записування файлів в R

  • purrr, для функціонального програмування

  • tibble, для роботи з тібблами (tibble), просунутий варіант дата фреймів

  • stringr, для роботи з текстовими даними

  • forcats, для роботи з факторами (factors)

Крім того є ще низка допоміжних пакетів, які не входять до ядра tidyverse але вважаються його частиною:

  • vroom, для швидкого завантаження даних

  • DBI, для роботи з базами даних

  • haven, для даних SPSS, Stata та SAS

  • httr, для роботи з API

  • readxl для завантаження .xls та .xlsx файлів

  • googlesheets4, для роботи з Google Sheet

  • googledrive, для роботи з Google Drive

  • rvest, для скрапінгу веб-сторінок

  • jsonlite, для роботи з JSON-файлами

  • xml2, для роботи з XML

  • lubridate, для роботи з датами

  • dbplyr, для перетворення коду dplyr в SQL

  • dtplyr, для перетворення коду на data.table

  • magrittr, для використання конвеєрів %>% (pipe)

  • glue, для поєднання даних та тексту

  • tidymodels, для роботи з моделями манинного навчання.

І це ще не повний список. Крім офіційних пакетів tidyverse є ще низка пакетів, які намагаються відповідати принципам tidyverse і доповнюють його.

Для завантаження tidyverse необхідно виконати наступний код:

install.packages("tidyverse")

Для підключення:

2.2 Завантаження даних


2.2.1 Завантаження .csv, .tsv файлів

Стандартною функцією завантаження даних типу .csv є функція read.csv(), але на досить великих масивах даних краще використовувати read_csv() з пакету readr. Синтаксис цих функцій схожий, але read_csv() одразу приведе дані до формату tibble. Першим аргументом функції є шлях до файлу (із оберненим слешем /). Також можна використовувати прямі URL-посилання на файл:

read_file <- read_csv("docs/data/file.csv")
read_url <- read_csv("https://git.io/JztOr")

Аналогічно до read_csv() можна використовувати функцію vroom з однойменного пакету. Головною особливістю цього пакету є швидкість завантаження даних.

vroom_file <- vroom("docs/data/file.csv")
vroom_url <- vroom("https://git.io/JztOr")

Для завантаження одночасно декількох файлів однакової структури корисно використовувати наступну конструкцію

filse <- dir(pattern = "\\.csv$")
vroom_all <- vroom(filse)

2.2.2 Завантаження .xls, .xlsx файлів

Для завантаження файлів Excel використовується пакет readxl та функція read_excel(). На початку можна отримати перелік листів файлу Excel за допомогою функції excel_sheets()

readxl::excel_sheets("docs/data/tourism.xlsx")
## [1] "Sheet1" "Sheet2" "Sheet3"

Після чого зчитати данні з потрібного листа

excel_file <- read_excel("docs/data/tourism.xlsx", sheet = "Sheet1")

В більшості випадків цього інструментарію має бути достатньо, але для завантаження специфічних файлів завжди можна знайти потрібний пакет. Не соромтеся використовувати google.

2.3 Маніпуляції з даними за допомогою пакету dplyr


dplyr — це один з найголовніших пакетів tidyverse. Головний його функціонал — це різноманітні маніпуляції з даними:

  • фільтрація даних — filter()

  • впорядкування даних — arrange()

  • вибір змінних — select()

  • створення нових змінних — mutate()

  • групування даних — group_by

  • агрегування даних — summarise()

2.3.1 Фільтрація рядків - filter()

Функція filter() дозволяє формувати підвибірки даних на основі їх значень. Її перший аргумент — ім’я дата фрейму, другий і наступні — умови фільтрації.

Розберемо на прикладі датасету gapmainder з однойменного пакету (див. таб. 2.1). В ньому збережена інформація про ВВП, очікувану тривалість життя при народженні та населення для 142 країн світу з 1952 по 2007 роки.

Таблиця 2.1: Перші шість значень датасету gapminder
country continent year lifeExp pop gdpPercap
Afghanistan Asia 1952 28.801 8425333 779.4453
Afghanistan Asia 1957 30.332 9240934 820.8530
Afghanistan Asia 1962 31.997 10267083 853.1007
Afghanistan Asia 1967 34.020 11537966 836.1971
Afghanistan Asia 1972 36.088 13079460 739.9811
Afghanistan Asia 1977 38.438 14880372 786.1134

Перш за все підключимо необхідні пакети:

Виконаємо просту фільтрацію з однією умовою:

filter(gapminder, year == 2007)
## # A tibble: 142 x 6
##    country     continent  year
##    <fct>       <fct>     <int>
##  1 Afghanistan Asia       2007
##  2 Albania     Europe     2007
##  3 Algeria     Africa     2007
##  4 Angola      Africa     2007
##  5 Argentina   Americas   2007
##  6 Australia   Oceania    2007
##  7 Austria     Europe     2007
##  8 Bahrain     Asia       2007
##  9 Bangladesh  Asia       2007
## 10 Belgium     Europe     2007
## # ... with 132 more rows, and 3
## #   more variables:
## #   lifeExp <dbl>, pop <int>,
## #   gdpPercap <dbl>

Фільтрація з декількома умовами:

filter(gapminder, year == 2007, continent == "Europe")
## # A tibble: 30 x 6
##    country       continent  year
##    <fct>         <fct>     <int>
##  1 Albania       Europe     2007
##  2 Austria       Europe     2007
##  3 Belgium       Europe     2007
##  4 Bosnia and H~ Europe     2007
##  5 Bulgaria      Europe     2007
##  6 Croatia       Europe     2007
##  7 Czech Republ~ Europe     2007
##  8 Denmark       Europe     2007
##  9 Finland       Europe     2007
## 10 France        Europe     2007
## # ... with 20 more rows, and 3
## #   more variables:
## #   lifeExp <dbl>, pop <int>,
## #   gdpPercap <dbl>

Умов фільтрації можна додавати безліч, їх можна перелічити через кому. Але створювати складні фільтрації можна у більш компактній формі. Для цього можна використати оператори: “ТА” (&), “АБО” (|), “НЕ” (!), а також функцію xor(), яка виключає АБО:

filter(gapminder, year == 2007 & country == "New Zealand")
## # A tibble: 1 x 6
##   country     continent  year
##   <fct>       <fct>     <int>
## 1 New Zealand Oceania    2007
## # ... with 3 more variables:
## #   lifeExp <dbl>, pop <int>,
## #   gdpPercap <dbl>

filter(gapminder, year == 2002 | year == 2007)
## # A tibble: 284 x 6
##    country     continent  year
##    <fct>       <fct>     <int>
##  1 Afghanistan Asia       2002
##  2 Afghanistan Asia       2007
##  3 Albania     Europe     2002
##  4 Albania     Europe     2007
##  5 Algeria     Africa     2002
##  6 Algeria     Africa     2007
##  7 Angola      Africa     2002
##  8 Angola      Africa     2007
##  9 Argentina   Americas   2002
## 10 Argentina   Americas   2007
## # ... with 274 more rows, and 3
## #   more variables:
## #   lifeExp <dbl>, pop <int>,
## #   gdpPercap <dbl>

Ще один зручний спосіб формування складного фільтру — використання виразу x %in% y, який фільтрує всі значення в яких x є одним із значень серед y:

filter(gapminder, year == 2007 & country %in% c("New Zealand", "Poland", "Ireland"))
## # A tibble: 3 x 6
##   country     continent  year
##   <fct>       <fct>     <int>
## 1 Ireland     Europe     2007
## 2 New Zealand Oceania    2007
## 3 Poland      Europe     2007
## # ... with 3 more variables:
## #   lifeExp <dbl>, pop <int>,
## #   gdpPercap <dbl>

2.3.2 Впорядкування рядків - arrange()

Функція arrange() впорядковує рядки в порядку зростання (для числових змінних) або в алфавітному порядку (для категоріальних змінних).

arrange(gapminder, lifeExp)
## # A tibble: 1,704 x 6
##    country      continent  year
##    <fct>        <fct>     <int>
##  1 Rwanda       Africa     1992
##  2 Afghanistan  Asia       1952
##  3 Gambia       Africa     1952
##  4 Angola       Africa     1952
##  5 Sierra Leone Africa     1952
##  6 Afghanistan  Asia       1957
##  7 Cambodia     Asia       1977
##  8 Mozambique   Africa     1952
##  9 Sierra Leone Africa     1957
## 10 Burkina Faso Africa     1952
## # ... with 1,694 more rows, and
## #   3 more variables:
## #   lifeExp <dbl>, pop <int>,
## #   gdpPercap <dbl>

Для впорядкування в порядку зменшення використовується функція desc() або знак - перед змінною.

arrange(gapminder, desc(lifeExp))
## # A tibble: 1,704 x 6
##    country       continent  year
##    <fct>         <fct>     <int>
##  1 Japan         Asia       2007
##  2 Hong Kong, C~ Asia       2007
##  3 Japan         Asia       2002
##  4 Iceland       Europe     2007
##  5 Switzerland   Europe     2007
##  6 Hong Kong, C~ Asia       2002
##  7 Australia     Oceania    2007
##  8 Spain         Europe     2007
##  9 Sweden        Europe     2007
## 10 Israel        Asia       2007
## # ... with 1,694 more rows, and
## #   3 more variables:
## #   lifeExp <dbl>, pop <int>,
## #   gdpPercap <dbl>

arrange(gapminder, -pop)
## # A tibble: 1,704 x 6
##    country continent  year
##    <fct>   <fct>     <int>
##  1 China   Asia       2007
##  2 China   Asia       2002
##  3 China   Asia       1997
##  4 China   Asia       1992
##  5 India   Asia       2007
##  6 China   Asia       1987
##  7 India   Asia       2002
##  8 China   Asia       1982
##  9 India   Asia       1997
## 10 China   Asia       1977
## # ... with 1,694 more rows, and
## #   3 more variables:
## #   lifeExp <dbl>, pop <int>,
## #   gdpPercap <dbl>

2.3.3 Відбір стовпчиків - select()

Функція select() дозволяє відібрати тільки ті змінні, які нас цікавлять. Як і минулого разу, перший аргумент функції — це дата фрейм, наступний — обрані стовпці:

select(gapminder, country, year, gdpPercap)
## # A tibble: 1,704 x 3
##    country      year gdpPercap
##    <fct>       <int>     <dbl>
##  1 Afghanistan  1952      779.
##  2 Afghanistan  1957      821.
##  3 Afghanistan  1962      853.
##  4 Afghanistan  1967      836.
##  5 Afghanistan  1972      740.
##  6 Afghanistan  1977      786.
##  7 Afghanistan  1982      978.
##  8 Afghanistan  1987      852.
##  9 Afghanistan  1992      649.
## 10 Afghanistan  1997      635.
## # ... with 1,694 more rows

Крім того не обов’язково вказувати назви змінних, можна вказувати їх порядковий номер:

select(gapminder, 1, 3, 5)
## # A tibble: 1,704 x 3
##    country      year      pop
##    <fct>       <int>    <int>
##  1 Afghanistan  1952  8425333
##  2 Afghanistan  1957  9240934
##  3 Afghanistan  1962 10267083
##  4 Afghanistan  1967 11537966
##  5 Afghanistan  1972 13079460
##  6 Afghanistan  1977 14880372
##  7 Afghanistan  1982 12881816
##  8 Afghanistan  1987 13867957
##  9 Afghanistan  1992 16317921
## 10 Afghanistan  1997 22227415
## # ... with 1,694 more rows

Або вказувати їх послідовність у векторі:

select(gapminder, c(1, 4:6))
## # A tibble: 1,704 x 4
##    country     lifeExp      pop
##    <fct>         <dbl>    <int>
##  1 Afghanistan    28.8  8425333
##  2 Afghanistan    30.3  9240934
##  3 Afghanistan    32.0 10267083
##  4 Afghanistan    34.0 11537966
##  5 Afghanistan    36.1 13079460
##  6 Afghanistan    38.4 14880372
##  7 Afghanistan    39.9 12881816
##  8 Afghanistan    40.8 13867957
##  9 Afghanistan    41.7 16317921
## 10 Afghanistan    41.8 22227415
## # ... with 1,694 more rows, and
## #   1 more variable:
## #   gdpPercap <dbl>

Аналогічно, послідовність буде працювати і для назв стовпців:

select(gapminder, c(country, lifeExp:gdpPercap))
## # A tibble: 1,704 x 4
##    country     lifeExp      pop
##    <fct>         <dbl>    <int>
##  1 Afghanistan    28.8  8425333
##  2 Afghanistan    30.3  9240934
##  3 Afghanistan    32.0 10267083
##  4 Afghanistan    34.0 11537966
##  5 Afghanistan    36.1 13079460
##  6 Afghanistan    38.4 14880372
##  7 Afghanistan    39.9 12881816
##  8 Afghanistan    40.8 13867957
##  9 Afghanistan    41.7 16317921
## 10 Afghanistan    41.8 22227415
## # ... with 1,694 more rows, and
## #   1 more variable:
## #   gdpPercap <dbl>

Функція everything() повертає всі стовпчики, але не буде повертати вже обрані стовпчики. Тому її можна використовувати для зміни позицій змінних в дата фреймі. Хоча в більшості випадків зручніше для таких задач використовувати функцію relocate().

select(gapminder, continent, everything())
## # A tibble: 1,704 x 6
##    continent country      year
##    <fct>     <fct>       <int>
##  1 Asia      Afghanistan  1952
##  2 Asia      Afghanistan  1957
##  3 Asia      Afghanistan  1962
##  4 Asia      Afghanistan  1967
##  5 Asia      Afghanistan  1972
##  6 Asia      Afghanistan  1977
##  7 Asia      Afghanistan  1982
##  8 Asia      Afghanistan  1987
##  9 Asia      Afghanistan  1992
## 10 Asia      Afghanistan  1997
## # ... with 1,694 more rows, and
## #   3 more variables:
## #   lifeExp <dbl>, pop <int>,
## #   gdpPercap <dbl>

За допомогою таких функцій як starts_with(), ends_with(), contains(), matches() можна відбирати стовпчики за певним патерном у назві.

Виберемо стовпчики, назва яких починається на латинську літеру “с

select(gapminder, starts_with("c"))
## # A tibble: 1,704 x 2
##    country     continent
##    <fct>       <fct>    
##  1 Afghanistan Asia     
##  2 Afghanistan Asia     
##  3 Afghanistan Asia     
##  4 Afghanistan Asia     
##  5 Afghanistan Asia     
##  6 Afghanistan Asia     
##  7 Afghanistan Asia     
##  8 Afghanistan Asia     
##  9 Afghanistan Asia     
## 10 Afghanistan Asia     
## # ... with 1,694 more rows

Або стовпчики, назва яких закінчується на латинську літеру “p

select(gapminder, ends_with("p"))
## # A tibble: 1,704 x 3
##    lifeExp      pop gdpPercap
##      <dbl>    <int>     <dbl>
##  1    28.8  8425333      779.
##  2    30.3  9240934      821.
##  3    32.0 10267083      853.
##  4    34.0 11537966      836.
##  5    36.1 13079460      740.
##  6    38.4 14880372      786.
##  7    39.9 12881816      978.
##  8    40.8 13867957      852.
##  9    41.7 16317921      649.
## 10    41.8 22227415      635.
## # ... with 1,694 more rows

Стовпчики, назва яких містить на латинську літеру “o

select(gapminder, contains("o"))
## # A tibble: 1,704 x 3
##    country     continent     pop
##    <fct>       <fct>       <int>
##  1 Afghanistan Asia       8.43e6
##  2 Afghanistan Asia       9.24e6
##  3 Afghanistan Asia       1.03e7
##  4 Afghanistan Asia       1.15e7
##  5 Afghanistan Asia       1.31e7
##  6 Afghanistan Asia       1.49e7
##  7 Afghanistan Asia       1.29e7
##  8 Afghanistan Asia       1.39e7
##  9 Afghanistan Asia       1.63e7
## 10 Afghanistan Asia       2.22e7
## # ... with 1,694 more rows

Функція matches() використовується для відбору за регулярними виразами, з якими можна ознайомитися у книзі “Mastering Regular Expressions” (Friedl 2006).

Відбір стовпчиків за їх типом даних виконується за допомогою функції select_if():

select_if(gapminder, is.numeric)
## # A tibble: 1,704 x 4
##     year lifeExp      pop
##    <int>   <dbl>    <int>
##  1  1952    28.8  8425333
##  2  1957    30.3  9240934
##  3  1962    32.0 10267083
##  4  1967    34.0 11537966
##  5  1972    36.1 13079460
##  6  1977    38.4 14880372
##  7  1982    39.9 12881816
##  8  1987    40.8 13867957
##  9  1992    41.7 16317921
## 10  1997    41.8 22227415
## # ... with 1,694 more rows, and
## #   1 more variable:
## #   gdpPercap <dbl>

2.3.4 Зміна назви стовпчиків - rename()

Для зміни назви стовпчиків використовується функція rename(). Синтаксис функції: нова_назва = стара_назва.

rename(gapminder, population = pop)
## # A tibble: 1,704 x 6
##    country     continent  year
##    <fct>       <fct>     <int>
##  1 Afghanistan Asia       1952
##  2 Afghanistan Asia       1957
##  3 Afghanistan Asia       1962
##  4 Afghanistan Asia       1967
##  5 Afghanistan Asia       1972
##  6 Afghanistan Asia       1977
##  7 Afghanistan Asia       1982
##  8 Afghanistan Asia       1987
##  9 Afghanistan Asia       1992
## 10 Afghanistan Asia       1997
## # ... with 1,694 more rows, and
## #   3 more variables:
## #   lifeExp <dbl>,
## #   population <int>,
## #   gdpPercap <dbl>

Замість старої назви можна вказати порядковий номер стовпчика:

rename(gapminder, population = 5)
## # A tibble: 1,704 x 6
##    country     continent  year
##    <fct>       <fct>     <int>
##  1 Afghanistan Asia       1952
##  2 Afghanistan Asia       1957
##  3 Afghanistan Asia       1962
##  4 Afghanistan Asia       1967
##  5 Afghanistan Asia       1972
##  6 Afghanistan Asia       1977
##  7 Afghanistan Asia       1982
##  8 Afghanistan Asia       1987
##  9 Afghanistan Asia       1992
## 10 Afghanistan Asia       1997
## # ... with 1,694 more rows, and
## #   3 more variables:
## #   lifeExp <dbl>,
## #   population <int>,
## #   gdpPercap <dbl>

Змінити назву стовпчика за певною умовою можна за допомогою функції rename_with(). Наприклад, записати всі назви великими літерами:

rename_with(gapminder, toupper)
## # A tibble: 1,704 x 6
##    COUNTRY     CONTINENT  YEAR
##    <fct>       <fct>     <int>
##  1 Afghanistan Asia       1952
##  2 Afghanistan Asia       1957
##  3 Afghanistan Asia       1962
##  4 Afghanistan Asia       1967
##  5 Afghanistan Asia       1972
##  6 Afghanistan Asia       1977
##  7 Afghanistan Asia       1982
##  8 Afghanistan Asia       1987
##  9 Afghanistan Asia       1992
## 10 Afghanistan Asia       1997
## # ... with 1,694 more rows, and
## #   3 more variables:
## #   LIFEEXP <dbl>, POP <int>,
## #   GDPPERCAP <dbl>

Стовпчики, які починаються на латинську “c” записати великими літерами:

rename_with(gapminder, toupper, starts_with("c"))
## # A tibble: 1,704 x 6
##    COUNTRY     CONTINENT  year
##    <fct>       <fct>     <int>
##  1 Afghanistan Asia       1952
##  2 Afghanistan Asia       1957
##  3 Afghanistan Asia       1962
##  4 Afghanistan Asia       1967
##  5 Afghanistan Asia       1972
##  6 Afghanistan Asia       1977
##  7 Afghanistan Asia       1982
##  8 Afghanistan Asia       1987
##  9 Afghanistan Asia       1992
## 10 Afghanistan Asia       1997
## # ... with 1,694 more rows, and
## #   3 more variables:
## #   lifeExp <dbl>, pop <int>,
## #   gdpPercap <dbl>

Більш складний варіант, але дуже часто вживаний — заміна певного символу або частини в назві. Такі варіанти зустрічаються, коли в назвах стовпчиків зустрічаються зайві “пробіли.” В нашому дата фреймі з цим все добре, але для прикладу замінемо всі “co” на “CO

rename_with(gapminder, ~ gsub("co", "CO", .x))
## # A tibble: 1,704 x 6
##    COuntry     COntinent  year
##    <fct>       <fct>     <int>
##  1 Afghanistan Asia       1952
##  2 Afghanistan Asia       1957
##  3 Afghanistan Asia       1962
##  4 Afghanistan Asia       1967
##  5 Afghanistan Asia       1972
##  6 Afghanistan Asia       1977
##  7 Afghanistan Asia       1982
##  8 Afghanistan Asia       1987
##  9 Afghanistan Asia       1992
## 10 Afghanistan Asia       1997
## # ... with 1,694 more rows, and
## #   3 more variables:
## #   lifeExp <dbl>, pop <int>,
## #   gdpPercap <dbl>

2.3.5 Використання пайпів - %>%

Пайпи (pipes) — це потужний та зручний інструмент для чіткого опису послідовності операцій. Для пояснення зручності його використання розглянемо два варіанти запису одного і того ж коду. Ті хто працював в Excel зараз згадають весь той біль.

Для написання пайпів в RStudio є комбінація клавіш: Ctrl + Shift + m

Вкладена функція, як в Excel:

rename_with(select_if(filter(gapminder, country == "Ireland"), is.numeric), toupper)
## # A tibble: 12 x 4
##     YEAR LIFEEXP     POP
##    <int>   <dbl>   <int>
##  1  1952    66.9 2952156
##  2  1957    68.9 2878220
##  3  1962    70.3 2830000
##  4  1967    71.1 2900100
##  5  1972    71.3 3024400
##  6  1977    72.0 3271900
##  7  1982    73.1 3480000
##  8  1987    74.4 3539900
##  9  1992    75.5 3557761
## 10  1997    76.1 3667233
## 11  2002    77.8 3879155
## 12  2007    78.9 4109086
## # ... with 1 more variable:
## #   GDPPERCAP <dbl>

Той самий код з використанням %>%:

gapminder %>% 
  filter(country == "Ireland") %>% 
  select_if(is.numeric) %>% 
  rename_with(toupper)
## # A tibble: 12 x 4
##     YEAR LIFEEXP     POP
##    <int>   <dbl>   <int>
##  1  1952    66.9 2952156
##  2  1957    68.9 2878220
##  3  1962    70.3 2830000
##  4  1967    71.1 2900100
##  5  1972    71.3 3024400
##  6  1977    72.0 3271900
##  7  1982    73.1 3480000
##  8  1987    74.4 3539900
##  9  1992    75.5 3557761
## 10  1997    76.1 3667233
## 11  2002    77.8 3879155
## 12  2007    78.9 4109086
## # ... with 1 more variable:
## #   GDPPERCAP <dbl>

Погодьтеся, що другий варіант читається значно легше. Пайп працює наступним чином: він приймає результат виконання попереднього коду та передає його в якості першого аргументу наступній функції, такий собі конвєер. При цьому кожну наступну функцію ми можемо писати з наступного рядка.

Взагалі, з приводу оформлення tidy-коду бажано ознайомитися з матеріалами Хедлі Вікема (Wickham 2021)

Інколи результат виконання функції необхідно передавати не в перший аргумент наступної функції. В таких випадках можна використовувати крапку (.), щоб визначити, куди ми хочемо вставити результат попередньої функції.

1:10 %>% {c(min(.), max(.))}
## [1]  1 10

# або 

c(min(1:10), max(1:10))
## [1]  1 10

Майже весь наступний код я буду писати вже з використанням %>%.

2.3.6 Створення нових стовпчиків - mutate()

Для створення нових стовпчиків використовується функція mutate(). Вона завжди додає нові стовпчики в кінець дата фрейму.

Розрахуємо загальний ВВП країни світу в мільярдах доларів США та додамо ще одну змінну country_group, яка буде характеризувати рівень ВВП країни (більше 250 млрд — високий, менше — нормальний). Для цього перемножимо ВВП на душу населення на кількість населення та поділимо на 1000000000, після чого використаємо функцію if_else (аналог “=ЕСЛИ” з Excel).

gapminder %>% 
  mutate(GDP_billion = gdpPercap * pop / 10^9,
         country_group = if_else(GDP_billion > 250, "hight_gpd", "normal_gdp")) %>% 
  filter(year == 2007)
## # A tibble: 142 x 8
##    country     continent  year
##    <fct>       <fct>     <int>
##  1 Afghanistan Asia       2007
##  2 Albania     Europe     2007
##  3 Algeria     Africa     2007
##  4 Angola      Africa     2007
##  5 Argentina   Americas   2007
##  6 Australia   Oceania    2007
##  7 Austria     Europe     2007
##  8 Bahrain     Asia       2007
##  9 Bangladesh  Asia       2007
## 10 Belgium     Europe     2007
## # ... with 132 more rows, and 5
## #   more variables:
## #   lifeExp <dbl>, pop <int>,
## #   gdpPercap <dbl>,
## #   GDP_billion <dbl>,
## #   country_group <chr>

Звертаю увагу, що останній стовпчик country_group був створений за допомогою попереднього нового стовпчика GDP_billion.

Також можна проводити різноманітні маніпуляції з цілою низкою стовпчиків за допомогою функцій across() та where(). Наприклад, розрахуємо натуральний логарифм до всіх числових стовпчиків:

gapminder %>% 
  mutate(across(where(is.numeric), log))
## # A tibble: 1,704 x 6
##    country     continent  year
##    <fct>       <fct>     <dbl>
##  1 Afghanistan Asia       7.58
##  2 Afghanistan Asia       7.58
##  3 Afghanistan Asia       7.58
##  4 Afghanistan Asia       7.58
##  5 Afghanistan Asia       7.59
##  6 Afghanistan Asia       7.59
##  7 Afghanistan Asia       7.59
##  8 Afghanistan Asia       7.59
##  9 Afghanistan Asia       7.60
## 10 Afghanistan Asia       7.60
## # ... with 1,694 more rows, and
## #   3 more variables:
## #   lifeExp <dbl>, pop <dbl>,
## #   gdpPercap <dbl>

Або запишемо всі категоріальні змінні з великої літери:

gapminder %>% 
  mutate(across(where(is.factor), toupper))
## # A tibble: 1,704 x 6
##    country     continent  year
##    <chr>       <chr>     <int>
##  1 AFGHANISTAN ASIA       1952
##  2 AFGHANISTAN ASIA       1957
##  3 AFGHANISTAN ASIA       1962
##  4 AFGHANISTAN ASIA       1967
##  5 AFGHANISTAN ASIA       1972
##  6 AFGHANISTAN ASIA       1977
##  7 AFGHANISTAN ASIA       1982
##  8 AFGHANISTAN ASIA       1987
##  9 AFGHANISTAN ASIA       1992
## 10 AFGHANISTAN ASIA       1997
## # ... with 1,694 more rows, and
## #   3 more variables:
## #   lifeExp <dbl>, pop <int>,
## #   gdpPercap <dbl>

Для того, щоб залишити лише “новостворені” стовпчики використовується функція tranmutate():

gapminder %>% 
  transmute(GDP_billion = gdpPercap * pop / 10^9)
## # A tibble: 1,704 x 1
##    GDP_billion
##          <dbl>
##  1        6.57
##  2        7.59
##  3        8.76
##  4        9.65
##  5        9.68
##  6       11.7 
##  7       12.6 
##  8       11.8 
##  9       10.6 
## 10       14.1 
## # ... with 1,694 more rows

2.3.7 Групування та агрегація даних - group_by(), summarise()

Агрегація даних по групам — частовживана задача. Наприклад, коли ми хочемо розрахувати якісь середні значення в середені групи. В dplyr цей процес виконується з використанням двох функцій: групування - group_by() та агрегації - summarise().

Згрупуємо дані за континентом та розрахуємо середнє та медіанне значення очікуваної тривалості життя при народженні, а також кількість країн в кожній групі:

gapminder %>% 
  filter(year == 2007) %>% 
  group_by(continent) %>% 
  summarise(mean_life = mean(lifeExp),
            median_life = median(lifeExp),
            count = n()) %>% 
  arrange(-mean_life)
## # A tibble: 5 x 4
##   continent mean_life
##   <fct>         <dbl>
## 1 Oceania        80.7
## 2 Europe         77.6
## 3 Americas       73.6
## 4 Asia           70.7
## 5 Africa         54.8
## # ... with 2 more variables:
## #   median_life <dbl>,
## #   count <int>

2.4 Створення звітів: R Markdown