dplyr
: продолжение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