R语言如何提取数据列中[]包裹的内容并生成新code列?
你当前使用的gsub是全局替换函数,核心逻辑是将匹配到的内容替换为指定字符串,和你需要「提取所有匹配内容并拼接」的需求不符,所以才会出现反向效果。
注意:你提到原始列名为fruits,如果你实际存储内容的列名为Name(从你现有代码的noc$Name推测),把下方代码里的列名替换为Name即可。
实现方案
方案1:使用stringr包(更简洁,tidyverse生态常用)
用str_extract_all提取所有符合规则的方括号内容,再对提取结果做判断,空值返回NA,非空值用逗号拼接。
# 加载依赖包 library(dplyr) library(stringr) noc <- noc %>% mutate(code = str_extract_all(fruits, "\\[\\d+\\]") %>% sapply(function(x) { ifelse(length(x) == 0, NA_character_, paste(x, collapse = ", ")) }))
如果你的方括号内不全是数字,需要匹配任意方括号包裹内容,可将正则替换为
\\[[^\\]]+\\],避免贪婪匹配错误。
方案2:Base R实现(无需安装额外包)
用base R自带的gregexpr和regmatches完成提取,再做后续处理:
# 提取所有匹配的方括号内容 match_res <- gregexpr("\\[\\d+\\]", noc$fruits) extract_res <- regmatches(noc$fruits, match_res) # 生成新列 noc$code <- sapply(extract_res, function(x) { if (length(x) == 0) NA_character_ else paste(x, collapse = ", ") })
用你给出的示例值apples [8]; bananas [102], pineapple [4000], total测试,以上两种方案都可以输出预期结果[8], [102], [4000],无匹配内容的行将返回NA。
内容的提问来源于stack exchange,提问作者user15032839
相关产品推荐
相关产品推荐

