使用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
相关产品推荐
相关产品推荐

