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

