Урок 10 Пакет tidyr: Работа с вложенными столбцами, unnest_longer, unnest_wider

10.1 Описание

JSON и XML являются чрезвычайно популярными форматами хранения и обмена информацией, как правило, за счёт своей компактности.

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

Урок посвящён пакету tidyr, входящему в ядро библиотеки tidyverse, и функциям unnest_longer(), unnest_wider() и hoist().

10.2 Видео

10.3 Материалы

Все материалы к данному уроку можно найти по ссылке.

10.4 Код

library(tidyr)
library(dplyr)
library(jsonlite)

# #################
# задача 1:
# имеется json файл со списком сотрудников
# 1. необходимо получить сотрудников у которых предусмотренны бонусы

# читаем json файл
staff_dict <- read_json('https://raw.githubusercontent.com/selesnow/r4excel_users/master/lesson_10/simple.json')

# преобразуем json в tibble frame
staff_dict <- tibble(employee = staff_dict)

# 2. посчитать среднюю зарплату по отделам
# разворачиваем каждый json узел в виде отдельной строки
# фильтруем таблицу оставляя только тех сотрудников у которых есть бонусы
staff_dict %>%
  unnest_wider(employee) %>%
  filter(bonus > 0)

# считаем среднюю зарплату по отделам
staff_dict %>%
  unnest_wider(employee) %>%
  group_by(department) %>%
  summarise(average_salary = mean(salary))


# ##########################
# задача 3:
# имеется json файл со списком сотрудников
# вывести список сотрудников с их зоной ответвенности
staff_dict <- read_json('https://raw.githubusercontent.com/selesnow/r4excel_users/master/lesson_10/hard_data.json')

# преобразуем json в tibble frame
staff_dict <- tibble(employee = staff_dict)

## вариант решения #1
staff_dict %>%
  unnest_wider(employee) %>%
  select(name, department, salary, skills) %>%
  unnest_wider(skills) %>%
  select(name, department, salary, practics) %>% 
  unnest_longer(practics) %>%
  group_by(name, department, salary) %>%
  summarise(practics = paste(practics, collapse = ", "))

## вариант решения #2 
staff_dict %>%
  hoist(employee, 
        name = "name",
        department = "department",
        salary = "salary",
        practics = c("skills", "practics")) %>%
  select(-employee) %>%
  group_by(name, department, salary) %>%
  mutate(practics = paste(unlist(practics), collapse = ", "))

# ##########################
# задача 4:
# имеется json файл со списком сотрудников
# поднять на 20% зарплату сотрудникам владеющим языком R
staff_dict %>%
  hoist(employee, 
        name = "name",
        salary = "salary",
        langs = c("skills", "lang")) %>% 
  select(-employee) %>%
  unnest_longer(langs) %>%
  filter(langs == 'R') %>%
  mutate(new_salary = salary * 1.2)

# задача 5:
# имеется json файл со списком сотрудников
# поднять на 30% зарплату сотрудникам владеющим более чем одним языком программирования
staff_dict %>%
  hoist(employee, 
        name = "name",
        salary = "salary",
        langs = c("skills", "lang")) %>% 
  select(-employee) %>%
  group_by(name) %>%
  unnest_longer(langs) %>%
  filter( ! is.na(langs) ) %>%
  group_by( name, salary ) %>%
  summarise( langs_num = length(langs) ) %>%
  filter(langs_num > 1) %>%
  mutate( new_salary =  salary * 1.3 )

10.5 Тест