如何在R中展开str_split结果并保留对应ID列关联
解决方案
在R中处理这类字符串拆分并保留关联ID的需求,最惯用的方式是借助tidyverse工具集里的separate_rows函数,一步就能完成拆分和行展开;也可以用base R结合stringr实现,以下是两种具体方法:
方法一:tidyverse 简洁实现(推荐)
tidyr::separate_rows专门用于将包含多值的列拆分成多行,同时自动保留其他列的对应关系,非常适合你的场景:
library(tidyverse) # 原始数据 ID <- c(1, 1, 2, 3) strings <- c("garbage", "trash", "trash \r\n garbage", "garbage \t\n trash \r junk") test.frame <- data.frame(ID, strings) # 拆分并展开行,用正则\\s+匹配任意空白字符(换行、制表符、空格等) result <- test.frame %>% separate_rows(strings, sep = "\\s+") # 查看结果 print(result)
运行后会直接得到你需要的格式:
ID strings 1 1 garbage 2 1 trash 3 2 trash 4 2 garbage 5 3 garbage 6 3 trash 7 3 junk
方法二:base R 实现
如果不想加载tidyverse,也可以用stringr::str_split结合base R的向量操作完成:
library(stringr) # 原始数据 ID <- c(1, 1, 2, 3) strings <- c("garbage", "trash", "trash \r\n garbage", "garbage \t\n trash \r junk") test.frame <- data.frame(ID, strings) # 拆分字符串为列表 split_list <- str_split(test.frame$strings, "\\s+") # 生成与拆分后元素数量匹配的ID向量 expanded_ID <- rep(test.frame$ID, sapply(split_list, length)) # 扁平化拆分后的字符串列表 expanded_strings <- unlist(split_list) # 组合成结果数据框 result_base <- data.frame(ID = expanded_ID, strings = expanded_strings) print(result_base)
两种方法都能避免手动写循环,符合R语言的惯用编程风格。
内容的提问来源于stack exchange,提问作者MZimbric
相关产品推荐
相关产品推荐

