Урок 8 Оконные функции в R

8.1 Описание

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

В этом уроке мы продолжаем изучать пакет dplyr, и функции group_by(), mutate(), а также новые cumsum(), lag(), lead() и arrange().

8.2 Видео

8.3 Материалы

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

8.4 Код

library(readr)
library(dplyr)

# загрузка данных
salary <- read_csv("D:\\Google Диск\\Курс 20 шагов от Excel до языка R\\materials\\lesson_8\\salary_analysis.csv")

# структура таблицы
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))

8.5 Тест