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

如何筛选tibble中变量包含另一向量任意子串的观测?

报错原因

代码报错的核心是逻辑迭代方向错误:

  • purrr::map_lgl(my_letters, ~stringr::str_detect(a, .x)) 迭代的是匹配向量my_letters,每次迭代都会针对整列a返回长度和tibble行数一致的逻辑向量,不符合map_lgl要求每次返回单个逻辑值的规则
  • 外层any()会把所有返回的逻辑值合并为单个布尔值,也不符合dplyr::filter()要求输入和行数等长的逻辑向量的规则

解决方案

方案1:正则拼接(最简洁)

stringr::str_detect本身支持多模式匹配,只需要把要匹配的子串用|拼接为正则的「或」关系即可,不需要嵌套循环:

library(dplyr)
library(stringr)

my_letters <- c("a", "b", "c")
tibble::tibble(a = c("foo", "bar", "paz")) |>
  filter(str_detect(a, paste(my_letters, collapse = "|")))

运行结果会正确返回包含bar、paz的两行。
如果匹配的子串包含正则特殊字符(比如.、*等),可以用str_c("(", str_escape(my_letters), ")", collapse = "|")处理后再作为匹配模式。

方案2:行迭代实现

如果要保留循环判断的写法,可以先按行分组,再对每行的单个值做判断:

library(dplyr)
library(purrr)
library(stringr)

my_letters <- c("a", "b", "c")
tibble::tibble(a = c("foo", "bar", "paz")) |>
  rowwise() |>
  filter(any(map_lgl(my_letters, ~str_detect(a, .x)))) |>
  ungroup() # 后续不需要行分组的话可以取消该行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:30:04