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

使用tidyr拆分含多分隔符的变长字符串列至规范格式

解决方案:拆分可变长度的"代码-日期"对并转长表

用R的tidyverse工具链可以轻松实现需求,步骤如下:

1. 准备示例数据

先构造和你的数据结构一致的示例,方便验证:

library(tidyverse)

df <- tibble(
  prod_no = c("P001", "P002", "P003"),
  prod_code_date = c("A1:2023-01-01", "B2:2023-02-01,C3:2023-03-01", "D4:2023-04-01,E5:2023-05-01,F6:2023-06-01")
)

2. 按逗号拆分生成动态列

用separate_wider_delim按,拆分prod_code_date,自动生成item_1、item_2等动态列:

df_wider <- df %>%
  separate_wider_delim(
    cols = prod_code_date,
    delim = ",",
    names_sep = "_",
    too_few = "align_start"  # 组数不足的行左侧对齐,空缺列填NA
  )

3. 转长表并拆分代码与日期

把宽表转成长表后,再按:拆分每组的代码和日期:

df_long <- df_wider %>%
  pivot_longer(
    cols = starts_with("item_"),
    names_to = "item_id",
    values_to = "code_date",
    values_drop_na = TRUE  # 过滤掉空值行
  ) %>%
  separate_wider_delim(
    cols = code_date,
    delim = ":",
    names = c("code", "date"),
    too_few = "error"  # 若有格式错误(缺冒号)直接报错,也可设为"align_start"生成NA
  ) %>%
  select(prod_no, code, date)  # 保留需要的列

最终结果

运行后得到的长表格式如下:

print(df_long)
#> # A tibble: 6 × 3
#>   prod_no code  date      
#>   <chr>   <chr> <chr>     
#> 1 P001    A1    2023-01-01
#> 2 P002    B2    2023-02-01
#> 3 P002    C3    2023-03-01
#> 4 P003    D4    2023-04-01
#> 5 P003    E5    2023-05-01
#> 6 P003    F6    2023-06-01

注意事项

  • 如果你的数据存在格式不规范的行(比如某个"代码-日期"对缺冒号),可以把separate_wider_delim里的too_few参数改成"align_start",此时缺失的字段会填充为NA,避免报错中断流程。
  • 若prod_code_date的分隔符有空格(比如, ),需要把delim改成", ",确保拆分准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 11:06:07