Сгруппированные сводки и 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 — локальная установка не требуется.
Все уроки этого курса
- Сгруппированные сводки и group_by()
- Оконные функции: lag, lead, cumsum
- Объединение нескольких таблиц в dplyr
- Аккуратное вычисление: {{ }} и .data