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
в SQLdtplyr, для перетворення коду на
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
з однойменного пакету. Головною особливістю цього пакету є швидкість завантаження даних.
Для завантаження одночасно декількох файлів однакової структури корисно використовувати наступну конструкцію
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 роки.
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)
Інколи результат виконання функції необхідно передавати не в перший аргумент наступної функції. В таких випадках можна використовувати крапку (.
), щоб визначити, куди ми хочемо вставити результат попередньої функції.
Майже весь наступний код я буду писати вже з використанням
%>%
.
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>