R Academy · Урок

Из широкого формата в длинный с pivot_longer()

Преобразуйте таблицы из широкого формата в аккуратный длинный формат для анализа.

Урок 1 из 413 шагов

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

Широкий и длинный формат данных

Данные можно хранить в широком формате (одна строка на объект и несколько столбцов со значениями) или в длинном формате (одна строка на наблюдение, отдельный столбец для имени переменной и ещё один для значения). Многие пакеты R для визуализации и построения моделей ожидают данные в длинном формате.

library(tidyr)
library(dplyr)

# Wide format: each quarter is a column
wide_df <- data.frame(
  student = c('Alice','Bob','Carol'),
  q1 = c(85, 90, 78),
  q2 = c(88, 85, 80),
  q3 = c(92, 88, 84)
)

print(wide_df)
cat('\nShape:', nrow(wide_df), 'rows x', ncol(wide_df), 'cols')

Основы pivot_longer()

pivot_longer(df, cols, names_to, values_to) преобразует широкий формат в длинный. cols задаёт столбцы для преобразования, names_to — новый столбец для прежних имён столбцов, а values_to — новый столбец для значений.

library(tidyr)

wide_df <- data.frame(
  student = c('Alice','Bob','Carol'),
  q1 = c(85, 90, 78),
  q2 = c(88, 85, 80),
  q3 = c(92, 88, 84)
)

long_df <- pivot_longer(
  wide_df,
  cols = c(q1, q2, q3),
  names_to = 'quarter',
  values_to = 'score'
)

print(long_df)

Выбор столбцов с помощью starts_with()

Вместо явного перечисления столбцов используйте вспомогательные функции tidyselect внутри cols. starts_with('prefix'), ends_with('suffix') и contains('string') особенно полезны для единообразного преобразования столбцов с похожими именами.

library(tidyr)

df <- data.frame(
  id = 1:3,
  sales_jan = c(100, 200, 150),
  sales_feb = c(120, 180, 160),
  sales_mar = c(130, 190, 170)
)

# Select all sales_ columns automatically
pivot_longer(
  df,
  cols = starts_with('sales_'),
  names_to = 'month',
  values_to = 'sales'
)

Исключение столбцов с помощью -col

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

library(tidyr)

df <- data.frame(
  region = c('East','West'),
  jan = c(100, 200),
  feb = c(110, 210),
  mar = c(120, 220),
  apr = c(130, 230)
)

# Pivot everything except 'region'
pivot_longer(df, cols = -region, names_to = 'month', values_to = 'revenue')

names_prefix — удаление префиксов

Если имена столбцов имеют префикс, например score_q1 и score_q2, аргумент names_prefix удаляет этот префикс из результирующего столбца names_to. Так идентификатор остаётся чистым.

library(tidyr)

df <- data.frame(
  id = 1:3,
  score_q1 = c(85, 90, 78),
  score_q2 = c(88, 85, 80),
  score_q3 = c(92, 88, 84)
)

pivot_longer(
  df,
  cols = starts_with('score_'),
  names_to = 'quarter',
  names_prefix = 'score_',
  values_to = 'score'
)

Преобразование нескольких наборов столбцов

Если у Вас есть несколько групп столбцов со значениями (например, sales_q1 и cost_q1), используйте names_to с несколькими значениями и names_pattern, чтобы разделить имена столбцов на части.

library(tidyr)

df <- data.frame(
  id = 1:2,
  sales_q1 = c(100, 200),
  sales_q2 = c(110, 210),
  cost_q1 = c(60, 110),
  cost_q2 = c(65, 115)
)

pivot_longer(
  df,
  cols = -id,
  names_to = c('.value', 'quarter'),
  names_pattern = '(.+)_(q[0-9]+)'
)

names_transform — преобразование типов

По умолчанию новый столбец имён имеет строковый тип. Используйте names_transform, чтобы автоматически преобразовать его в другой тип (например, получить целочисленный год из имён столбцов вроде y2020 и y2021).

library(tidyr)

df <- data.frame(
  product = c('A','B'),
  y2021 = c(100, 200),
  y2022 = c(110, 210),
  y2023 = c(120, 220)
)

result <- pivot_longer(
  df,
  cols = -product,
  names_to = 'year',
  names_prefix = 'y',
  names_transform = list(year = as.integer),
  values_to = 'sales'
)

print(result)
cat('year column type:', class(result$year))

values_drop_na — удаление пропущенных значений

Если в широком формате для некоторых сочетаний столбцов и строк отсутствуют значения, в длинном формате они отображаются как NA. Установите values_drop_na = TRUE, чтобы автоматически удалить строки, в которых значение равно NA.

library(tidyr)

df <- data.frame(
  student = c('Alice','Bob','Carol'),
  q1 = c(85, NA, 78),
  q2 = c(88, 85, NA),
  q3 = c(NA, 88, 84)
)

# Without drop: 9 rows including NAs
pivot_longer(df, -student, names_to='quarter', values_to='score',
             values_drop_na = TRUE)

Длинный формат открывает возможности ggplot2

Главная причина преобразовать данные в длинный формат: ggplot2 сопоставляет эстетические параметры со столбцами. Когда все значения находятся в одном столбце, а их категории — в другом, можно без труда использовать color = quarter или facet_wrap(~quarter).

library(tidyr)
# (ggplot2 not run here, but showing the data preparation)

df <- data.frame(
  month = c('Jan','Feb','Mar'),
  product_A = c(100, 120, 110),
  product_B = c(200, 190, 210)
)

# After pivoting, ready for ggplot2:
long_df <- pivot_longer(df, -month, names_to='product', values_to='sales')
print(long_df)
# ggplot(long_df, aes(x=month, y=sales, color=product)) + geom_line()

Преобразование столбцов с числовыми именами

Иногда имена столбцов состоят только из чисел (например, годы: 2020, 2021). В R числовые имена столбцов в кадрах данных заключаются в кавычки. Используйте num_range('', 2020:2023) или обратные кавычки в аргументе cols, чтобы работать с ними.

library(tidyr)

# Year columns as numbers (common in census-style data)
df <- data.frame(
  country = c('US','UK'),
  '2021' = c(100, 80),
  '2022' = c(110, 85),
  '2023' = c(120, 90),
  check.names = FALSE
)

pivot_longer(
  df,
  cols = c('2021','2022','2023'),
  names_to = 'year',
  values_to = 'gdp_index'
)

Сравнение результатов преобразования

После преобразования проверьте результат: число строк должно быть равно nrow(wide) * n_pivoted_cols, а уникальные значения в столбце names_to должны соответствовать исходным именам столбцов (за вычетом удалённого префикса).

library(tidyr)

wide <- data.frame(
  id = 1:4,
  jan = c(10,20,30,40),
  feb = c(11,21,31,41),
  mar = c(12,22,32,42)
)

long <- pivot_longer(wide, -id, names_to='month', values_to='value')

cat('Wide rows:', nrow(wide), '\n')
cat('Long rows:', nrow(long), '(expected', nrow(wide)*3, ')\n')
cat('Months:', paste(unique(long$month), collapse=', '), '\n')

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

Что делает аргумент names_prefix в pivot_longer()?

Итоги: pivot_longer()

Главное о преобразовании широкого формата в длинный:

  • pivot_longer(df, cols, names_to, values_to) — основная функция
  • cols принимает выражения tidyselect: starts_with(), -id_col, c('a','b')
  • names_prefix удаляет начальную строку из имён столбцов
  • names_transform преобразует тип столбца с именами (например, в целочисленный)
  • values_drop_na = TRUE автоматически удаляет строки с NA
  • Длинный формат требуется ggplot2, большинству функций построения моделей и статистическим тестам
  • Проверка: число строк в длинном формате = число строк в широком формате × число преобразованных столбцов
library(tidyr)

df <- data.frame(
  team = c('Alpha','Beta'),
  sales_2022 = c(100, 200),
  sales_2023 = c(120, 220),
  sales_2024 = c(140, 240)
)

pivot_longer(
  df,
  cols = starts_with('sales_'),
  names_to = 'year',
  names_prefix = 'sales_',
  names_transform = list(year = as.integer),
  values_to = 'revenue'
)
Можно начать бесплатно

Изучай R с ИИ-репетитором — бесплатно

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

Курсы
43
Уроки
159

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

Урок «Из широкого формата в длинный с pivot_longer()» бесплатный?

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

Чему я научусь в уроке «Из широкого формата в длинный с pivot_longer()»?

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

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

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

Сколько времени занимает урок «Из широкого формата в длинный с pivot_longer()»?

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

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

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

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

  1. Из широкого формата в длинный с pivot_longer()
  2. Из длинного формата в широкий с pivot_wider()
  3. separate() и unite() для строковых столбцов
  4. Вложенные и развёрнутые таблицы данных
← Назад к R Academy