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

使用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_stringseverity_kw
kw3, kw1kw1
kw5kw5
no keywordNA
kw2, kw6, kw4kw2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:40:25