使用 separate() 和 unite() 处理字符串列
拆分和合并包含多段信息的列值
使用 separate() 和 unite() 处理字符串列 是 CoddyKit 上的免费 R Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 R Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 R Academy 课程共包含 4 节课。
拆分和合并字符串列
原始数据通常会把多条信息挤在同一列中(例如,'2024-03-15' 包含年、月和日)。tidyr 的 separate() 和 unite() 函数可以将一列拆分为多列,或将多列合并为一列。
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 = '-'
)使用 convert 参数调用 separate()
默认情况下,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))使用 remove = FALSE 调用 separate()
默认情况下,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 = ' '
)使用 remove = FALSE 调用 unite()
与 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='/')处理多余或缺失的部分
当拆分出的部分多于 into 列时,separate() 提供 extra 参数:'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() 处理字符串列」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 R Academy 课程的其余内容,请升级到 CoddyKit PRO。 R Academy 课程共包含 4 节课。
「使用 separate() 和 unite() 处理字符串列」这节课中我会学到什么?
拆分和合并包含多段信息的列值 你通过在浏览器中直接运行的动手代码来练习 R Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 R Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 R Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「使用 separate() 和 unite() 处理字符串列」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 R Academy 课中编写并运行代码吗?
能。每节 R Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 pivot_longer() 将宽格式转换为长格式
- 使用 pivot_wider() 将长格式转换为宽格式
- 使用 separate() 和 unite() 处理字符串列
- 嵌套与展开数据框