Семинар 3. Таблицы и dplyr. Решения.

Часть 1

На этом семинаре мы будем работать с файлом, содержащим информацию о годах постройки жилых домов в Москве. Данные достаточно новые, а для вдохновения посмотрите, что можно получить, используя эту информацию.

Мы, правда, займемся пока вещами попроще.

  1. Загрузите файл moscow-buildings.csv и сохраните ее как df_build. Посмотрите на датафрейм.
library(dplyr)
df_build <- read.csv("https://raw.githubusercontent.com/allatambov/R-programming-3/master/seminars/sem4-08-12/moscow-buildings.csv", encoding="UTF-8")
# View(df_build)
  1. Используя функции dplyr, удалите из базы данных строки, в которых значения года постройки не указаны (“н.д.”), а после превратите столбец year в числовой. R будет воспринимать столбец как факторный, поэтому нужно сначала превратить его в текстовый, а затем - в числовой или использовать специальную функцию levels().
df_build <- df_build %>% filter(house_year != "н.д.") %>% 
  mutate(house_year = as.numeric(levels(house_year)[house_year]))
  1. Посмотрите на минимальное и максимальное значения года постройки. Разумны ли они? Если нет, уберите из базы данных «странные» значения годы постройки.
df_build %>% summarise(min = min(house_year), max = max(house_year))
##   min      max
## 1   5 19781962
df_build <- df_build %>% filter(house_year > 1600 & house_year < 2018)
  1. Выберите из базы данных строки, соответствующие Басманному району и сохраните их в базу basm_data.
basm_data <- df_build %>% filter(area_name == "муниципальный округ Басманный")
  1. Сгруппируйте данные в базе по районам и посмотрите, сколько домов в базе относятся к каждому району.
df_build %>% group_by(area_name) %>% tally %>% View
  1. Найдите средний возраст дома (возраст - в годах, считаем от 2018) по каждому району.

    Подсказка: сначала добавьте переменную house_age («возраст дома»).

    df_build <- df_build %>% mutate(house_age = 2018 - house_year)
    
    df_build %>% group_by(area_name) %>% 
      summarise(avg_age = mean(house_age))
    ## # A tibble: 124 x 2
    ##    area_name                           avg_age
    ##    <fct>                                 <dbl>
    ##  1 муниципальный округ Академический      52.7
    ##  2 муниципальный округ Алексеевский       55.2
    ##  3 муниципальный округ Алтуфьевский       46.3
    ##  4 муниципальный округ Арбат              87.5
    ##  5 муниципальный округ Аэропорт           55.1
    ##  6 муниципальный округ Бабушкинский       50.1
    ##  7 муниципальный округ Басманный          84.3
    ##  8 муниципальный округ Беговой            32.5
    ##  9 муниципальный округ Бескудниковский    37.2
    ## 10 муниципальный округ Бибирево           39.5
    ## # ... with 114 more rows
  2. Найдите улицу с самым старым домом.

df_build %>% arrange(house_year) %>% head(1) %>% select(street_name)
##       street_name
## 1 40 лет Октября

Часть 2

Сейчас вам предлагается поработать с файлом CPDS.csv, который содержит показатели из Comparative Political Data Set. Познакомиться с проектом и codebook для таблицы можно здесь.

  1. Загрузить файл CPDS.csv, учитывая, что десятичный разделитель - запятая. Сделать так, чтобы текстовые столбцы считывались как текст, а не как факторы. Подсказка: аргумент stringsAsFactors = FALSE в функции read.csv().
cp <- read.csv("http://math-info.hse.ru/f/2018-19/pep/hw/CPDS.csv", dec = ",", stringsAsFactors = FALSE)
  1. Создать столбец log_pop с логарифмированными значения численности населения.
cp <- cp %>% mutate(log_pop = log(pop))
  1. Выбрать столбцы country, year, poco, eu, gov_right1, gov_cent1, gov_left1, log_pop и сохранить их как small.
small <- cp %>% select(country, year, poco, eu, gov_right1, gov_cent1, gov_left1, log_pop)
  1. Сколько наблюдений в датафрейме соответствуют пост-коммунистическим и не пост-коммунистическим странам?
cp %>% group_by(poco) %>% tally
## # A tibble: 2 x 2
##    poco     n
##   <int> <int>
## 1     0  1371
## 2     1   279
  1. Сколько пост-коммунистических и не пост-коммунистических стран в датафрейме? Подсказка: используйте функцию n_distinct для подсчёта уникальных значений в столбце.
cp %>% group_by(poco) %>% summarise(n = n_distinct(country))
## # A tibble: 2 x 2
##    poco     n
##   <int> <int>
## 1     0    25
## 2     1    11