Урок 8 Оконные функции в R
8.1 Описание
Оконные функции по смыслу похожи на агрегирующие, они также получают на вход массив значений и проводят над ними арифметические операции, но в исходящем результате не изменяют количество сток.
В этом уроке мы продолжаем изучать пакет dplyr
, и функции group_by()
, mutate()
, а также новые cumsum()
, lag()
, lead()
и arrange()
.
8.4 Код
library(readr)
library(dplyr)
# загрузка данных
<- read_csv("D:\\Google Диск\\Курс 20 шагов от Excel до языка R\\materials\\lesson_8\\salary_analysis.csv")
salary
# структура таблицы
str(salary)
# ######################
# Простые оконные функции
# ######################
# добавляем суммарную зарплату по отделу
<- salary %>%
salary group_by(departmen, month) %>%
mutate(total_dep = sum(total))
# какой процент зп получает каждый сотрудник в рамках отдела
<- salary %>%
salary mutate(staff_rate = total / total_dep)
# вывести по каждому сотруднику разницу от средней зарплаты по отделу
# в рамках месяца
%>%
salary group_by(departmen, month) %>%
mutate(from_dep_avg = total / mean(total))
# ######################
# Ранжирующие оконные функции
# ######################
# сотрудники имеющие наибольшую долю от ФОТ своего отдела по месяцам
<-
rating_by_dap_rate %>%
salary group_by(month) %>%
mutate(rank = min_rank(staff_rate)) %>%
filter(rank == max(rank)) %>%
arrange(month)
# сотрудники получившие максимальный бонус в рамках каждого месяца
%>%
salary group_by(month) %>%
mutate(rank = dense_rank(bonus)) %>%
filter(rank == max(rank)) %>%
arrange(month)
# сотрудники получившие макисмлаьные бонусы за 2019 год
# в по отделам
%>%
salary filter(grepl("^2019", month)) %>% # фильтр по гожу
group_by(name_dep, name_emploee) %>% # группировка по отделу и сотруднику
summarise(bonus = sum(bonus)) %>% # агрегация данных
group_by(name_dep) %>% # создание окна по отделу
mutate(max_bonus = max(bonus)) %>% # расчёт максимального бонуса в рамках отдела
filter(bonus == max_bonus) # оставляем тех чей бонус равен максимальному
# ######################
# Смещающие оконные функции
# ######################
# Вывести рост зарплаты каждого сотрудника относительно прошлого месяца
<-
salary_grow %>%
salary arrange(month) %>% # задаём сортировку по месяцам
group_by(id) %>% # разбиваем таблицу на окна по сотрудникам
mutate(total_grow_rate = ( total - lag(total, order_by = month) ) / total ) # расчёт роста
# вывести сотрудников с максимальным ростом зарплат
# в каждом месяце
%>%
salary group_by(id) %>% # разбиваем таблицу на окна по сотрудникам
mutate(total_grow_rate = ( total - lag(total, order_by = month) ) / total ) %>% # расчёт роста
group_by(month) %>%
filter(total_grow_rate == max(total_grow_rate, na.rm = T))