如何用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
相关产品推荐
相关产品推荐

