如何将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
相关产品推荐
相关产品推荐

