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

如何用mutate、case_when和str_detect获取所有匹配关键词?

解决方案:提取所有匹配关键词并拼接

case_when确实不适合这个场景——它是顺序匹配,一旦满足第一个条件就停止,无法捕获多个匹配的关键词。下面提供两种高效的实现方式:

方法1:关键词映射表 + 逐行检查拼接

先定义关键词与对应缩写的映射关系,再逐行检查标题中匹配的关键词,最后将匹配的缩写用分号拼接:

library(tidyverse)

# 定义关键词-缩写映射表
keyword_map <- tibble(
  pattern = regex(c("keyword1", "keyword2", "kword3", "kword4"), ignore_case = TRUE),
  abbr = c("k1", "k2", "k3", "k4")
)

df_result <- df %>%
  rowwise() %>%
  mutate(
    # 收集当前行匹配的所有缩写
    title_keyword = list(keyword_map$abbr[str_detect(title, keyword_map$pattern)]),
    # 拼接成指定格式,无匹配则设为NA
    title_keyword = if(length(title_keyword) > 0) str_c(title_keyword, collapse = "; ") else NA_character_
  ) %>%
  ungroup() %>%
  # 将新列放到year列之后
  relocate(title_keyword, .after = year)

方法2:str_extract_all + 关键词替换

先把所有关键词合并成正则表达式,一次性提取标题中所有匹配项,再替换为对应缩写后拼接:

library(tidyverse)

# 构建关键词到缩写的命名向量
keyword_abbr <- c(
  "keyword1" = "k1",
  "keyword2" = "k2",
  "kword3" = "k3",
  "kword4" = "k4"
)

# 生成忽略大小写的正则匹配规则
regex_pattern <- str_c(names(keyword_abbr), collapse = "|") %>%
  regex(ignore_case = TRUE)

df_result <- df %>%
  mutate(
    title_keyword = str_extract_all(title, regex_pattern) %>%
      map_chr(function(matches) {
        if(length(matches) == 0) {
          NA_character_
        } else {
          # 替换为缩写、去重后拼接
          matches %>%
            str_to_lower() %>%
            recode(!!!keyword_abbr) %>%
            unique() %>%
            str_c(collapse = "; ")
        }
      })
  ) %>%
  relocate(title_keyword, .after = year)

两种方法都能得到你预期的输出:

print(df_result)
#> # A tibble: 6 × 6
#>        id treatment_modalities no_patients  year title_keyword title                         
#>     <dbl> <chr>                      <dbl> <dbl> <chr>         <chr>                         
#> 1 3693381 HIFU                          32  2023 k1; k2        Title with keyword1 and keywo…
#> 2 3692114 UAE                           NA  2022 k3; k1        A second title with kword3 an…
#> 3 3960149 UAE; RFA; HIFU               152  2023 k4            Here we have kword4 and nothi…
#> 4 3689834 UAE; RFA                      NA  2023 k4; k3        A title with kword4 and kword…
#> 5 3643286 UAE; HIFU                     15  2023 k1; k2; k3    And one with keyword1, keywor…
#> 6 3344795 UAE                          428  2023 <NA>          This title does not contain a…

注意事项

  • 方法1用rowwise()逐行处理,适合关键词数量较少的场景;
  • 方法2用str_extract_all一次性提取所有匹配项,效率更高,还能自动处理同一关键词重复出现的情况;
  • 两种方法都保留了忽略大小写的匹配规则,与你原代码逻辑一致。

内容的提问来源于stack exchange,提问作者d.math

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:58:12