在R中使用str_detect按字符变量分组数据表时遇错误求解决
我有一个以数值列为主的数据表,其中包含一个约有30种不同取值的字符变量列。我希望在R中使用str_detect函数读取该字符列的信息,将其与一个字符串向量进行匹配,新增一列并根据字符列是否包含向量中的任一字符串赋值。我以iris数据集为例尝试实现:
mydesiredgrouping <- c("virginica","versicolor") test <- iris %>% mutate(Group1 = if_else(str_detect(iris$Species, mydesiredgrouping), "mygroup", "notmygroup"))
但运行时出现错误:
Error in
mutate(): ℹ In argument:Group1 = if_else(...). Caused by error instr_detect(): ! Can't recyclestring(size 150) to matchpattern(size 2). Runrlang::last_trace()to see where the error occurred.
补充说明:我的实际数据集中存在部分匹配的情况,这也是我选择使用str_detect的原因。
解决方案
错误原因
str_detect的pattern参数默认不支持直接传入多元素向量,因为它无法自动将长度为2的模式向量与长度为150的字符串列完成循环匹配,因此触发了回收错误。要实现"匹配任一模式"的需求,需要将多模式合并为正则表达式,或通过遍历实现批量匹配。
方法1:正则表达式拼接多模式(推荐)
将多个目标字符串用paste(..., collapse = "|")拼接成一个正则表达式(|在正则语法中表示"或"),这样str_detect就能一次性检查字符串是否包含任一目标模式:
library(dplyr) library(stringr) mydesiredgrouping <- c("virginica","versicolor") # 拼接成正则表达式:"virginica|versicolor" target_pattern <- paste(mydesiredgrouping, collapse = "|") test <- iris %>% mutate(Group1 = if_else(str_detect(Species, target_pattern), "mygroup", "notmygroup"))
方法2:遍历匹配(适合复杂场景)
如果需要更灵活的匹配逻辑(比如对不同模式添加独立匹配规则),可以用purrr::map_lgl遍历每行的字符串,检查是否匹配任一目标模式:
library(dplyr) library(stringr) library(purrr) mydesiredgrouping <- c("virginica","versicolor") test <- iris %>% mutate(Group1 = if_else( # 对每行Species,检查是否匹配任一目标模式 map_lgl(Species, ~any(str_detect(.x, mydesiredgrouping))), "mygroup", "notmygroup" ))
效果说明
两种方法都支持部分匹配:例如如果你的字符列中存在类似"abcvirginicadef"的内容,str_detect会正确识别其包含目标模式,并赋值为"mygroup"。
内容的提问来源于stack exchange,提问作者Liptongal

