R语言用str_split按|分割字符串列 如何将结果拆分为多列
解决方案
你之前的代码只完成了字符串拆分、得到存储字符向量的列表列,没有将列表内容展开为独立宽列,通过以下方式可直接得到预期结果。
方法1:tidyr 新版函数(推荐,代码最简洁)
直接使用separate_wider_delim一步完成拆分,不需要提前手动调用str_split,函数会自动适配不同行拆分后的元素数量、生成对应个数的新列,同时兼容分隔符前后空格不统一的情况。
基于你提供的示例数据集的实现代码:
library(tidyverse) # 构造示例数据集 vname<-c("x1", "x2", "x3","x4") label<-c("1,Eng |2,Man", "1,yes|2,no|3,dont know", "1,never|2,sometimes|3,usually|4,always", "1,yes|2,No|3,dont know") df<-data.frame(vname, label) # 拆分指定列为独立列 df_result <- df %>% separate_wider_delim( cols = label, # 指定要拆分的列 delim = regex("\\s*\\|\\s*"), # 正则匹配|分隔符,自动兼容|前后0到多个空格的情况 names_sep = "", # 新列名格式为「原列名+序号」,即label1、label2、label3…… too_few = "align_start" # 拆分后元素不足的行自动补NA,避免报错 )
运行后输出结果和预期完全一致:
# A tibble: 4 × 5 vname label1 label2 label3 label4 <chr> <chr> <chr> <chr> <chr> 1 x1 1,Eng 2,Man NA NA 2 x2 1,yes 2,no 3,dont kn… NA 3 x3 1,never 2,sometimes 3,usually 4,always 4 x4 1,yes 2,No 3,dont kn… NA
针对你提供的真实业务数据集,待拆分的是value列而非label列(你之前的代码存在列名引用错误,会覆盖原有的题项标签内容),调整列名参数即可:
cd2_result <- cd2 %>% separate_wider_delim( cols = value, delim = regex("\\s*\\|\\s*"), names_sep = "", too_few = "align_start" )
方法2:兼容旧版tidyr的实现
如果使用的tidyr版本较低没有separate_wider_delim函数,可以先完成字符串拆分,再通过unnest_wider将列表列展开为多列,效果完全一致:
# 示例数据集实现 df_result <- df %>% mutate(label = str_split(label, "\\s*\\|\\s*")) %>% unnest_wider(label, names_sep = "") # 真实数据集实现 cd2_result <- cd2 %>% mutate(value = str_split(value, "\\s*\\|\\s*")) %>% unnest_wider(value, names_sep = "")
注意事项
- 不要将分隔符写死为
|(即竖线前后固定一个空格),你提供的真实数据中竖线前后存在无空格、多空格的混合情况,使用正则\\s*\\|\\s*可以一次性适配所有格式,不需要提前单独清理空格。 - 函数会自动识别全表拆分后最多的元素个数,生成对应数量的新列,元素不足的行会自动填充空值(NA),不需要手动提前指定拆分后的列数。
内容的提问来源于stack exchange,提问作者Rstudyer
相关产品推荐
相关产品推荐

