0Pricing
R Academy · Урок

Сгруппированные сводки и group_by()

Агрегируйте данные по группам и вычисляйте статистики для каждой группы.

«Сгруппированные сводки и group_by()» — бесплатный урок R Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.

Зачем группировать данные?

Группировка данных — одна из самых мощных операций в анализе данных. Вместо вычисления статистик для всего набора данных вы вычисляете их внутри каждой группы. Пакет dplyr делает это интуитивно понятным с помощью group_by(), за которым следует summarize().

library(dplyr)

# Sample sales data
sales <- data.frame(
  region = c('North','North','South','South','East'),
  revenue = c(120, 95, 200, 175, 88),
  units = c(10, 8, 15, 12, 7)
)

print(sales)

Основы group_by()

group_by(col) помечает фрейм данных так, чтобы последующие операции выполнялись для каждой группы. Сами данные не изменяются — добавляются метаданные о группировке. Группировать можно по одному или нескольким столбцам.

library(dplyr)

sales <- data.frame(
  region = c('North','North','South','South','East'),
  revenue = c(120, 95, 200, 175, 88),
  units = c(10, 8, 15, 12, 7)
)

# Group by region
grouped <- sales %>% group_by(region)
print(grouped)
print(group_keys(grouped))

summarize() после group_by()

summarize() (или summarise()) сводит каждую группу к одной строке. Вы задаёте имена новых столбцов и применяемые функции сводки. Распространённые функции: n(), mean(), sum(), min(), max().

library(dplyr)

sales <- data.frame(
  region = c('North','North','South','South','East'),
  revenue = c(120, 95, 200, 175, 88),
  units = c(10, 8, 15, 12, 7)
)

sales %>%
  group_by(region) %>%
  summarize(
    n = n(),
    mean_revenue = mean(revenue),
    total_units = sum(units)
  )

Подсчёт с помощью n()

n() внутри summarize() возвращает количество строк в каждой группе. Аргументы не требуются. Чтобы посчитать строки, соответствующие условию, используйте sum(condition). n_distinct(col) подсчитывает уникальные значения.

library(dplyr)

employees <- data.frame(
  dept = c('HR','HR','Eng','Eng','Eng','Sales'),
  salary = c(55000, 60000, 95000, 105000, 90000, 70000),
  senior = c(FALSE, TRUE, TRUE, TRUE, FALSE, FALSE)
)

employees %>%
  group_by(dept) %>%
  summarize(
    count = n(),
    senior_count = sum(senior),
    avg_salary = mean(salary)
  )

Группировка по нескольким столбцам

В group_by() можно передать несколько столбцов. Группы формируются по каждой комбинации значений, представленной в данных. Это полезно для построения перекрёстных таблиц и иерархических сводок.

library(dplyr)

orders <- data.frame(
  region = c('North','North','South','South','North','South'),
  product = c('A','B','A','B','A','A'),
  sales = c(100, 200, 150, 250, 120, 180)
)

orders %>%
  group_by(region, product) %>%
  summarize(
    total_sales = sum(sales),
    orders = n(),
    .groups = 'drop'
  )

Аргумент .groups

После summarize() результат всё ещё сгруппирован по всем переменным группировки, кроме последней. Аргумент .groups управляет этим поведением:

  • 'drop_last' — значение по умолчанию, удаляет последний уровень группировки
  • 'drop' — удаляет всю группировку
  • 'keep' — сохраняет всю группировку
library(dplyr)

df <- data.frame(
  year = c(2022,2022,2023,2023),
  quarter = c('Q1','Q2','Q1','Q2'),
  revenue = c(100, 120, 130, 150)
)

# .groups = 'drop' ensures ungrouped result
result <- df %>%
  group_by(year, quarter) %>%
  summarize(total = sum(revenue), .groups = 'drop')

print(result)
print(is.grouped_df(result))  # FALSE

Явный вызов ungroup()

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

library(dplyr)

df <- data.frame(
  dept = c('HR','HR','Eng','Eng'),
  salary = c(55000, 60000, 95000, 105000)
)

# Without ungroup: rank is within group
df %>%
  group_by(dept) %>%
  mutate(rank_in_dept = rank(salary)) %>%
  ungroup() %>%
  mutate(rank_overall = rank(salary))

group_keys() и n_groups()

group_keys() возвращает фрейм данных с уникальными комбинациями групп. n_groups() сообщает количество существующих групп. Эти функции удобны для проверки структуры данных перед выполнением операций по группам.

library(dplyr)

df <- data.frame(
  country = c('US','US','UK','UK','DE'),
  category = c('A','B','A','A','B'),
  value = c(10, 20, 15, 25, 30)
)

grouped <- df %>% group_by(country, category)

cat('Number of groups:', n_groups(grouped), '\n')
print(group_keys(grouped))

Сводка с несколькими статистиками

В одном вызове summarize() можно вычислить множество сводных статистик. Одновременно объединяйте подсчёт, среднее, медиану, стандартное отклонение, минимум, максимум и пользовательские вычисления.

library(dplyr)

scores <- data.frame(
  class = c('A','A','A','B','B','B','C','C'),
  score = c(85, 90, 78, 92, 88, 95, 70, 75)
)

scores %>%
  group_by(class) %>%
  summarize(
    n = n(),
    mean_score = round(mean(score), 1),
    median_score = median(score),
    sd_score = round(sd(score), 2),
    min_score = min(score),
    max_score = max(score)
  )

Учитывающая группы функция mutate()

mutate() после group_by() вычисляет значения внутри каждой группы, сохраняя все строки (в отличие от summarize()). Это идеально подходит для вычисления показателей уровня группы, которые нужно добавить к каждой строке.

library(dplyr)

sales <- data.frame(
  region = c('East','East','West','West','West'),
  rep = c('Alice','Bob','Carol','Dave','Eve'),
  revenue = c(150, 200, 120, 180, 160)
)

sales %>%
  group_by(region) %>%
  mutate(
    region_total = sum(revenue),
    pct_of_region = round(100 * revenue / sum(revenue), 1)
  ) %>%
  ungroup()

Фильтрация внутри групп

filter() после group_by() фильтрует строки на основе условий уровня группы. Например, можно оставить только лучшего исполнителя в каждом регионе или строки, где значение превышает среднее по группе.

library(dplyr)

sales <- data.frame(
  region = c('East','East','West','West','North','North'),
  rep = c('Alice','Bob','Carol','Dave','Eve','Frank'),
  revenue = c(150, 200, 120, 180, 95, 130)
)

# Keep the top rep per region
sales %>%
  group_by(region) %>%
  filter(revenue == max(revenue)) %>%
  ungroup()

Быстрая проверка

Что делает аргумент .groups = 'drop' в summarize()?

Повторение: сводки по группам

Основные выводы о сводках по группам:

  • group_by(col) добавляет группировку: данные не изменяются, но операции начинают учитывать группы
  • summarize() сводит каждую группу к одной строке — используйте n(), mean(), sum() и другие функции
  • .groups = 'drop' гарантирует, что результат не будет сгруппирован
  • ungroup() удаляет группировку в любой момент
  • group_keys() позволяет просмотреть уровни группировки; n_groups() подсчитывает их
  • mutate() + group_by() добавляет столбцы уровня группы, не сворачивая строки
library(dplyr)

# Full pipeline example
data.frame(
  dept = c('Eng','Eng','HR','HR','Sales'),
  salary = c(95000, 110000, 60000, 65000, 75000)
) %>%
  group_by(dept) %>%
  summarize(
    headcount = n(),
    avg_salary = mean(salary),
    .groups = 'drop'
  ) %>%
  arrange(desc(avg_salary))

Часто задаваемые вопросы

Урок «Сгруппированные сводки и group_by()» бесплатный?

Да — полный текст урока «Сгруппированные сводки и group_by()» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.

Чему я научусь в уроке «Сгруппированные сводки и group_by()»?

Агрегируйте данные по группам и вычисляйте статистики для каждой группы. Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать R Academy?

Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Сгруппированные сводки и group_by()»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке R Academy?

Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Сгруппированные сводки и group_by()
  2. Оконные функции: lag, lead, cumsum
  3. Объединение нескольких таблиц в dplyr
  4. Аккуратное вычисление: {{ }} и .data
← Назад к R Academy