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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:27:17