0Pricing
R Academy · Урок

separate() и unite() для строковых столбцов

Разделяйте и объединяйте значения столбцов, содержащие несколько фрагментов информации.

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

Разделение и объединение строковых столбцов

В необработанных данных несколько фрагментов информации часто помещены в один столбец (например, '2024-03-15' содержит год, месяц и день). Функции separate() и unite() пакета tidyr разделяют один столбец на несколько или объединяют несколько столбцов в один.

library(tidyr)

# Date stored as a single string column
df <- data.frame(
  id = 1:4,
  date = c('2024-01-15','2024-03-22','2023-11-08','2024-06-30'),
  value = c(100, 200, 150, 175)
)

print(df)

separate() — разделение одного столбца на несколько

separate(df, col, into, sep) разделяет символьный столбец на несколько новых столбцов с помощью разделителя. Аргумент into задаёт имена новых столбцов; sep — это разделитель (по умолчанию любой неалфавитно-цифровой символ).

library(tidyr)

df <- data.frame(
  id = 1:4,
  date = c('2024-01-15','2024-03-22','2023-11-08','2024-06-30')
)

# Split 'date' into year, month, day
separate(
  df,
  col = date,
  into = c('year','month','day'),
  sep = '-'
)

separate() с аргументом convert

По умолчанию separate() создаёт символьные столбцы. Установите convert = TRUE, чтобы автоматически преобразовать новые столбцы в наиболее подходящий тип (целочисленный, числовой или логический). Это особенно полезно для столбцов года и месяца.

library(tidyr)

df <- data.frame(
  event = c('2024-1','2024-2','2023-12'),
  score = c(85, 90, 78)
)

result <- separate(
  df,
  col = event,
  into = c('year','month'),
  sep = '-',
  convert = TRUE
)

print(result)
cat('year type:', class(result$year), '\n')
cat('month type:', class(result$month))

separate() с remove = FALSE

По умолчанию separate() удаляет исходный столбец. Установите remove = FALSE, чтобы сохранить его вместе с новыми разделёнными столбцами. Это полезно, если Вы хотите проверить результат разделения или сохранить исходный столбец для справки.

library(tidyr)

df <- data.frame(
  full_code = c('US-CA-001','US-TX-002','UK-LDN-003')
)

separate(
  df,
  col = full_code,
  into = c('country','state','code'),
  sep = '-',
  remove = FALSE   # Keep original column
)

separate() по фиксированным позициям

Вместо разделителя можно разделять строку по фиксированным позициям символов, передав в sep целочисленный вектор. Положительные целые числа отсчитываются слева, отрицательные — справа.

library(tidyr)

# Product code: first 3 chars = category, next 4 = id
df <- data.frame(
  code = c('ABC1234','XYZ5678','DEF9012'),
  qty = c(10, 20, 15)
)

separate(
  df,
  col = code,
  into = c('category','product_id'),
  sep = 3    # Split after position 3
)

unite() — объединение столбцов в один

unite(df, col, ..., sep) объединяет несколько столбцов в один символьный столбец. Первый аргумент после df — имя нового столбца, затем идут объединяемые столбцы и строка-разделитель.

library(tidyr)

df <- data.frame(
  first = c('Alice','Bob','Carol'),
  last = c('Smith','Jones','White'),
  score = c(85, 90, 78)
)

unite(
  df,
  col = 'full_name',
  first, last,
  sep = ' '
)

unite() с remove = FALSE

Как и separate(), unite() по умолчанию удаляет исходные столбцы. Установите remove = FALSE, чтобы сохранить исходные столбцы вместе с новым объединённым столбцом. Это полезно, когда нужны оба представления.

library(tidyr)

df <- data.frame(
  year = c(2024, 2024, 2023),
  month = c(1, 3, 12),
  day = c(15, 22, 8)
)

unite(
  df,
  col = 'date_str',
  year, month, day,
  sep = '-',
  remove = FALSE
)

unite() для создания ключей

Частое применение unite() — создание составных ключей путём объединения нескольких столбцов-идентификаторов. Это полезно перед объединением таблиц, которым нужен общий ключ, сформированный из нескольких полей.

library(tidyr)
library(dplyr)

orders <- data.frame(
  year = c(2024, 2024, 2023),
  region = c('East','West','East'),
  seq_num = c(1, 1, 2)
)

orders_keyed <- orders %>%
  unite(col = 'order_key', year, region, seq_num, sep = '_')

print(orders_keyed)

separate_rows() — разделение на несколько строк

separate_rows(df, col, sep) разделяет ячейку с несколькими значениями на отдельные строки. Это отличается от separate(), которая разделяет данные по столбцам. Функция полезна, когда ячейка содержит список элементов, разделённых запятыми.

library(tidyr)

# Tags stored as comma-separated values in one cell
df <- data.frame(
  id = 1:3,
  title = c('Intro to R','Data Viz','ML Basics'),
  tags = c('r,beginner','r,ggplot,visualization','r,ml,modeling')
)

separate_rows(df, tags, sep = ',')

Цепочка вызовов separate() и unite()

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

library(tidyr)
library(dplyr)

# Reformat date from YYYY-MM-DD to DD/MM/YYYY
df <- data.frame(
  id = 1:3,
  date = c('2024-01-15','2024-03-22','2023-11-08')
)

df %>%
  separate(date, into=c('year','month','day'), sep='-') %>%
  unite(col='date_eu', day, month, year, sep='/')

Обработка лишних или отсутствующих фрагментов

У separate() есть аргумент extra для случаев, когда фрагментов больше, чем столбцов into: 'warn' (по умолчанию), 'drop' (отбросить лишние) или 'merge' (сохранить последний фрагмент без разделения). Аналогично, fill обрабатывает случаи, когда фрагментов меньше: 'warn', 'right' или 'left'.

library(tidyr)

# Inconsistent data: some rows have 2 parts, some have 3
df <- data.frame(
  code = c('A-1','B-2-extra','C-3'),
  value = c(10, 20, 30)
)

# 'merge' keeps the last piece unsplit
separate(df, code, into=c('prefix','suffix'), sep='-',
         extra='merge')

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

Какую функцию следует использовать, чтобы разделить строки, в которых столбец содержит значения через запятую, например 'tag1,tag2,tag3', на отдельные строки по одному тегу?

Итоги: separate() и unite()

Главные выводы о функциях separate() и unite():

  • separate(col, into, sep) — разделяет один столбец на несколько по разделителю или позиции
  • convert = TRUE — автоматически преобразует типы результатов разделения
  • remove = FALSE — сохраняет исходный столбец в обеих функциях
  • unite(col, ..., sep) — объединяет несколько столбцов в один строковый столбец
  • separate_rows(col, sep) — разделяет значения с разделителями на несколько строк, а не столбцов
  • Аргументы extra и fill обрабатывают несогласованные результаты разделения
library(tidyr)
library(dplyr)

df <- data.frame(
  id = 1:3,
  datetime = c('2024-01-15 09:30','2024-03-22 14:15','2023-11-08 11:45')
)

df %>%
  separate(datetime, into=c('date','time'), sep=' ') %>%
  separate(date, into=c('year','month','day'), sep='-', convert=TRUE) %>%
  separate(time, into=c('hour','minute'), sep=':', convert=TRUE)

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

Урок «separate() и unite() для строковых столбцов» бесплатный?

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

Чему я научусь в уроке «separate() и unite() для строковых столбцов»?

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

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

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

Сколько времени занимает урок «separate() и unite() для строковых столбцов»?

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

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

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

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

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