使用dplyr/stringr按关键词优先级匹配赋值的报错求助
解决dplyr+stringr匹配优先级关键词的报错问题
问题说明
- 需求:基于按严重程度排序的关键词列表
severity <- c("kw1", "kw2", "kw3", "kw4", "kw5", "kw6"),遍历数据集的severity_string列,为每行匹配列表中优先级最高(最先出现)的关键词并赋值。 - 报错信息:运行dplyr+stringr代码时触发向量长度不匹配错误:
Error in dplyr::mutate(): ℹ In argument: severity_kw = dplyr::case_when(...). Caused by error in stringr::str_detect(): ! Can't recycle string (size 20) to match pattern (size 6)
测试数据集
用以下代码生成测试数据:
set.seed(123) n <- 20 severity <- c("kw1", "kw2", "kw3", "kw4", "kw5", "kw6") test_df <- tibble::tibble( id = 1:n, severity_string = sample( c( paste(sample(severity, sample(1:3, 1)), collapse = ", "), "no keyword", NA ), n, replace = TRUE ) )
报错原因
case_when中直接使用str_detect(severity_string, severity)会导致向量长度不匹配:severity_string是20行的列向量,severity是6个元素的关键词向量,stringr无法按预期实现"逐行匹配第一个优先级关键词"的逻辑,触发循环回收错误。
解决方案
推荐两种方法,优先选择方法1(效率更高):
方法1:正则拼接+str_extract
利用str_extract会返回第一个匹配结果的特性,将关键词列表拼接成正则表达式,一次性完成匹配:
library(dplyr) library(stringr) severity <- c("kw1", "kw2", "kw3", "kw4", "kw5", "kw6") test_df <- test_df %>% mutate( severity_kw = str_extract(severity_string, str_c(severity, collapse = "|")) )
方法2:逐行遍历匹配(适合复杂逻辑)
用purrr::map_chr逐行处理每行的severity_string,匹配优先级最高的关键词:
library(dplyr) library(stringr) library(purrr) severity <- c("kw1", "kw2", "kw3", "kw4", "kw5", "kw6") test_df <- test_df %>% mutate(severity_kw = map_chr(severity_string, function(x) { if (is.na(x)) return(NA_character_) # 找到所有匹配的关键词,取第一个(优先级最高) matched <- severity[str_detect(x, severity)] if (length(matched) == 0) NA_character_ else matched[1] }))
验证结果
运行上述代码后,severity_kw列会返回每行匹配到的最高优先级关键词,示例输出如下:
| severity_string | severity_kw |
|---|---|
| kw3, kw1 | kw1 |
| kw5 | kw5 |
| no keyword | NA |
| kw2, kw6, kw4 | kw2 |
内容的提问来源于stack exchange,提问作者TDeramus
相关产品推荐
相关产品推荐

