You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将data.frame中ID列的字符串拆分并生成新行?

拆分data.frame中带分隔符的列并生成多行

示例数据

try <- data.frame(name = c("a","b", "c","d", "e"), 
                  ID = c("123;345;444", "564;567", "891;456","789;987", "717;233"))

需求:将ID列按分号;拆分,每个拆分出的ID值单独成为一行,同时保留其他所有列(如name,实际数据包含更多列)的对应内容。


方法1:使用tidyverse的separate_rows(推荐)

这是最简洁的方案,自动处理所有额外列的复制:

library(tidyverse)

result <- try %>%
  separate_rows(ID, sep = ";")

输出结果:

result
#    name  ID
# 1     a 123
# 2     a 345
# 3     a 444
# 4     b 564
# 5     b 567
# 6     c 891
# 7     c 456
# 8     d 789
# 9     d 987
# 10    e 717
# 11    e 233

方法2:使用data.table(适合大数据量)

如果你的数据量很大,data.table的效率更高:

library(data.table)

setDT(try)
# 若仅保留name列,直接指定by参数
result <- try[, .(ID = unlist(strsplit(ID, ";"))), by = name]

# 若有更多列,用.SD保留所有其他列
result <- try[, .(ID = unlist(strsplit(ID, ";"))), by = .SD]

方法3:基础R实现(无需额外包)

不用加载任何包,手动处理索引和列复制:

# 拆分ID列为列表
id_list <- strsplit(try$ID, ";")
# 生成原数据行的重复索引
row_indices <- rep(seq(nrow(try)), sapply(id_list, length))

# 构造结果:保留所有非ID列,添加拆分后的ID
result <- cbind(
  try[row_indices, setdiff(names(try), "ID"), drop = FALSE],
  ID = unlist(id_list),
  stringsAsFactors = FALSE
)

内容的提问来源于stack exchange,提问作者jonny jeep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 02:02:00