如何在R中新建变量,其值取自与指定向量匹配的另一列变量
解决方案
完全可以实现,以下是两种常用实现方式,均可满足需求:
前置准备:构造示例数据
# 示例数据框 df <- data.frame( Names = c("milk", "pizza with tomato", "tuna with olive and beans"), Price = c(10, 30, 25) ) # 匹配关键词向量 x <- c("milk", "pizza", "tuna")
方案1:tidyverse生态(代码最简洁)
借助stringr包的字符串提取能力实现,适合已经在用tidyverse系列工具的场景:
library(tidyverse) df <- df %>% mutate( # 把关键词拼接为正则“或”逻辑,直接提取匹配到的内容 tag = str_extract(Names, paste(x, collapse = "|")) )
方案2:基础R实现(无需额外安装包)
适合不想加载第三方包的场景:
df$tag <- sapply(df$Names, function(name) { # 匹配所有命中的关键词 matched_key <- x[sapply(x, function(key) grepl(key, name, fixed = TRUE))] # 取第一个命中结果,无匹配返回空值 return(ifelse(length(matched_key) > 0, matched_key[1], NA_character_)) }, USE.NAMES = FALSE)
最终输出效果
执行完两种方案的任意一种,得到的结果如下:
| Names | Price | tag |
|---|---|---|
| milk | 10 | milk |
| pizza with tomato | 30 | pizza |
| tuna with olive and beans | 25 | tuna |
注意事项
- 如需忽略大小写匹配,把正则拼接部分改成
paste0("(?i)", paste(x, collapse = "|"))即可 - 单个产品名匹配到多个关键词时,默认返回第一个命中的结果;需要返回所有匹配结果可替换为
str_extract_all自行拼接 - 如果关键词包含正则特殊字符(如
.、*、+等),建议优先用基础R方案的fixed = TRUE参数,避免匹配异常
内容的提问来源于stack exchange,提问作者Dany
相关产品推荐
相关产品推荐

