Урок 10 Пакет tidyr: Работа с вложенными столбцами, unnest_longer, unnest_wider
10.1 Описание
JSON и XML являются чрезвычайно популярными форматами хранения и обмена информацией, как правило, за счёт своей компактности.
Но анализировать данные представленные в таких форматах сложно, поэтому их перед анализом необходимо привести к табличному виду, именно этому мы и научимся в данном видео.
Урок посвящён пакету tidyr
, входящему в ядро библиотеки tidyverse
, и функциям unnest_longer()
, unnest_wider()
и hoist().
10.4 Код
library(tidyr)
library(dplyr)
library(jsonlite)
# #################
# задача 1:
# имеется json файл со списком сотрудников
# 1. необходимо получить сотрудников у которых предусмотренны бонусы
# читаем json файл
<- read_json('https://raw.githubusercontent.com/selesnow/r4excel_users/master/lesson_10/simple.json')
staff_dict
# преобразуем json в tibble frame
<- tibble(employee = staff_dict)
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 файл со списком сотрудников
# вывести список сотрудников с их зоной ответвенности
<- read_json('https://raw.githubusercontent.com/selesnow/r4excel_users/master/lesson_10/hard_data.json')
staff_dict
# преобразуем json в tibble frame
<- tibble(employee = staff_dict)
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 )