R语言如何按双条件拆分同一列中不同格式的字符串?
R语言按条件拆分字符串实现方案
核心思路
- 先逐行检测字符串是否包含
docx关键词 - 根据检测结果动态匹配对应的拆分分隔符
- 逐行应用对应分隔符完成拆分
基础R实现代码
示例数据构造
data = data.frame( string = c("HFUFN-087836_661", "207465-125 - IK_6 Mar 2009.docx_37484956") )
拆分逻辑实现
# 检测每个字符串是否包含docx,动态生成拆分规则 split_pattern <- ifelse(grepl("docx", data$string), "x_", "_") # 逐行应用对应拆分规则 split_res <- mapply(strsplit, x = data$string, split = split_pattern) # 将拆分结果转为两列数据框 data_split <- data.frame( part1 = sapply(split_res, function(x) x[1]), part2 = sapply(split_res, function(x) x[2]) )
优化说明
如果需要保留docx的完整后缀,避免拆分后丢失末尾的x字符,可以把docx对应的拆分符替换为正则正向后视断言:
# 含docx的字符串按docx后的_拆分,保留完整docx后缀 split_pattern <- ifelse(grepl("docx", data$string), "(?<=docx)_", "_") # 拆分时需要开启perl正则支持 split_res <- mapply(strsplit, x = data$string, split = split_pattern, perl = TRUE)
Tidyverse风格实现(可选)
如果你习惯使用tidyverse系列工具,也可以用separate函数实现:
library(tidyverse) data %>% separate( col = string, into = c("part1", "part2"), sep = if_else(str_detect(string, "docx"), "(?<=docx)_", "_"), extra = "merge", perl = TRUE )
输出结果示例
使用优化后的正则拆分后,得到的结果如下:
| part1 | part2 |
|---|---|
| HFUFN-087836 | 661 |
| 207465-125 - IK_6 Mar 2009.docx | 37484956 |
内容的提问来源于stack exchange,提问作者T K
相关产品推荐
相关产品推荐

