如何从含字符串列表的R数据框列提取倒数两横杠间的子串
提取字符串倒数第二个与最后一个横杠间子串(含列表格式处理)
针对你的需求,这里提供一套R语言实现方案,同时兼容普通字符串和列表格式的观测值:
实现步骤
- 编写自定义函数,区分普通字符串和列表格式字符串分别处理
- 将函数批量应用到数据框目标列,生成新列
自定义提取函数
extract_target <- function(x) { # 识别列表格式字符串(以c(开头) if (grepl("^c\\(", x)) { # 剥离c(和)的包裹 x_clean <- gsub("^c\\(|\\)$", "", x) # 拆分出列表中的每个元素 elements <- strsplit(x_clean, ", ")[[1]] # 去掉元素两端的引号 elements <- gsub('"', "", elements) # 对每个元素提取目标子串 res <- sapply(elements, function(y) { # 正则捕获倒数第二个-与最后一个-之间的内容 sub(".*-([^-]+)-[^-]+$", "\\1", y) }) # 用逗号拼接多个结果 paste(res, collapse = ", ") } else { # 普通字符串直接用正则提取 sub(".*-([^-]+)-[^-]+$", "\\1", x) } }
应用函数生成新列
# 给数据框添加新列a_clean data$a_clean <- sapply(data$a, extract_target)
结果验证
运行代码后,查看生成的新列:
> data$a_clean [1] "29139" "2913A" "200B, 2919999"
完全符合你期望的输出。
正则说明
用到的正则表达式.*-([^-]+)-[^-]+$:
.*:匹配任意字符直到倒数第二个横杠([^-]+):捕获倒数第二个横杠和最后一个横杠之间的所有非横杠字符(目标内容)-[^-]+$:匹配最后一个横杠及其后面的所有内容,确保只提取倒数第二个区间的子串
内容的提问来源于stack exchange,提问作者ifoxfoot
相关产品推荐
相关产品推荐

