如何用正则匹配每两个数字后的逗号,结合dplyr拆分列生成对应行?
解决方案
问题原因
你之前的separate_rows参数sep匹配了完整的数字组,separate_rows会删除所有匹配到的分隔符内容,因此数字部分被直接删除,只留下空值或逗号。
实现方法
这里提供两种可直接运行的实现方案:
方案1:正则环视匹配分隔符(直接用separate_rows)
通过正向逆序环视,只匹配两组数字之间的逗号作为分隔符,不涉及数字本身的匹配:
library(dplyr) library(tidyr) df_example <- tibble(Lotes= "LOT1,LOT2,LOT3",NoModuloPlastico = "71,72,80,81,102,100") df_result_example <- df_example %>% separate_rows(Lotes, sep = ",") %>% # perl=TRUE启用PCRE正则支持环视语法 separate_rows(NoModuloPlastico, sep = "(?<=\\d{1,4},\\d{1,4}),", perl = TRUE)
方案2:先拆分再合并(适配任意长度数字、任意组数场景)
先把两个字段都拆分为列表,再对数字列两两合并,最后同步展开,逻辑更通用:
library(dplyr) library(tidyr) library(stringr) df_example <- tibble(Lotes= "LOT1,LOT2,LOT3",NoModuloPlastico = "71,72,80,81,102,100") df_result_example <- df_example %>% mutate( Lotes = strsplit(Lotes, ","), NoModuloPlastico = strsplit(NoModuloPlastico, ",") %>% lapply(function(num_vec) { paste(num_vec[c(TRUE, FALSE)], num_vec[c(FALSE, TRUE)], sep = ",") }) ) %>% unnest(c(Lotes, NoModuloPlastico))
运行结果
两种方案最终输出结果一致:
| Lotes | NoModuloPlastico |
|---|---|
| LOT1 | 71,72 |
| LOT2 | 80,81 |
| LOT3 | 102,100 |
内容的提问来源于stack exchange,提问作者Andres Hidalgo
相关产品推荐
相关产品推荐

