You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R语言中提取字符串指定关键词并生成新列?

提取字符串中的指定关键词并生成新列(R语言)

针对你需要从文本列中提取多个关键词(支持重复出现、不出现的情况),并生成包含匹配关键词的新列需求,这里提供两种简洁的解决方案:

方法一:使用stringr包(推荐,语法更直观)

stringr是tidyverse系列中处理字符串的工具包,str_extract_all函数可以一次性提取所有匹配的关键词,再通过sapply将结果整理为逗号分隔的字符串:

# 若未安装stringr,先执行安装:install.packages("stringr")
library(stringr)

# 原始数据
v <- c("red is cool", "I prefer blue", "yellow is better than blue", 
       "orange is controversial", "what are colors", 
       "sometimes I like pink and sometimes it's blue")
# 构建关键词匹配正则
text <- paste0(c("red", "blue", "yellow", "orange", "pink"), collapse = '|')

# 提取并整理结果
result <- sapply(str_extract_all(v, text), function(x) {
  if (length(x) == 0) NA_character_ else paste(x, collapse = ",")
})

# 输出结果
result

运行后得到的结果与你的预期一致:

[1] "red"         "blue"        "yellow,blue" "orange"      NA            "pink,blue"  

方法二:使用Base R(无需额外安装包)

如果不想依赖第三方包,可以用Base R的gregexpr和regmatches组合实现相同功能:

# 原始数据
v <- c("red is cool", "I prefer blue", "yellow is better than blue", 
       "orange is controversial", "what are colors", 
       "sometimes I like pink and sometimes it's blue")
text <- paste0(c("red", "blue", "yellow", "orange", "pink"), collapse = '|')

# 定位匹配位置并提取关键词
matches <- regmatches(v, gregexpr(text, v))

# 整理结果
result_base <- sapply(matches, function(x) {
  if (length(x) == 0) NA_character_ else paste(x, collapse = ",")
})

# 输出结果
result_base

关于你之前遇到的问题说明

  • grepl仅返回布尔值(是否存在匹配),无法提取具体关键词,因此只能处理单个关键词的判断,无法覆盖多关键词场景。
  • 直接使用if/else会报错,是因为if要求条件为长度1的逻辑值,而grepl返回的是与输入向量长度一致的布尔向量,此时应该用向量化的处理函数(如上面的sapply遍历)而非单分支的if/else。

内容的提问来源于stack exchange,提问作者Kat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 19:16:03