Функции summarize(), group_by() и tally()

Загрузим датасет, с которым мы работали в прошлый раз:

chile <- read.csv("http://math-info.hse.ru/f/2017-18/ps-ms/Chile.csv")

Сейчас речь пойдет, пожалуй, о самых полезных функциях dplyr :)

При работе с данными мы часто сталкиваемся с тем, что нам нужно получить какую-то сводную информацию по переменным. Для этого существует функция summarise(). Попробуем пока получить общее число строк в базе данных:

library(dplyr)
chile %>% summarise(total = n())
##   total
## 1  2700

Функция n() универсальна, она используется для подсчета элементов. К ней мы ещё вернемся.

Теперь сделаем что-нибудь более интересное. Определим минимальное, максимальное и среднее значение возраста респондентов в этом датафрейме.

chile %>% summarise(avg_age = mean(age), 
                    min_age = min(age), 
                    max_age = max(age))
##   avg_age min_age max_age
## 1      NA      NA      NA

Почему R не хочет ничего считать? Потому что в переменно age есть пропущенные значения! Как справиться с этой проблемой? Самое простое и очевидное — удалить NA из базы. Но это необязательно. У многих функций в R, работающих с переменными, есть параметр na.rm, который позволяет зафиксировать, исключать ли пропущенные значения (rm от remove) при подсчёте или нет.

chile %>% summarise(avg_age = mean(age, na.rm = TRUE), 
                    min_age = min(age, na.rm = TRUE), 
                    max_age = max(age,na.rm = TRUE))
##    avg_age min_age max_age
## 1 38.54872      18      70

Теперь всё в порядке.

Часто необходимо получить сводную информацию не по всем наблюдениям в базе, а по определенной группе. Для этого сначала нужно сгруппировать данные, основываясь на значениях какой-нибудь переменной. Воспользуемся функцией group_by() и посмотрим, сколько в базе респондентов из разных регионов:

chile %>% group_by(region) %>% summarise(count_reg = n())
## # A tibble: 5 x 2
##   region count_reg
##   <fct>      <int>
## 1 C            600
## 2 M            100
## 3 N            322
## 4 S            718
## 5 SA           960

А теперь посмотрим на средний возраст респондентов из разных регионов:

chile %>% group_by(region) %>% summarise(avg_income = mean(age, na.rm = TRUE))
## # A tibble: 5 x 2
##   region avg_income
##   <fct>       <dbl>
## 1 C            38.4
## 2 M            36.7
## 3 N            38.7
## 4 S            37.6
## 5 SA           39.5

Число наблюдений можно посчитать и по-другому — с помощью функции tally:

chile %>% group_by(sex) %>% summarise(count_sex = n())
## # A tibble: 2 x 2
##   sex   count_sex
##   <fct>     <int>
## 1 F          1379
## 2 M          1321
chile %>% group_by(sex) %>% tally()
## # A tibble: 2 x 2
##   sex       n
##   <fct> <int>
## 1 F      1379
## 2 M      1321