如何用dplyr筛选包含向量所有元素的数据框行?
解决数据框行筛选问题:保留任意列组合包含指定向量所有元素的行
问题分析
你需要筛选出数据框中所有指定字符串元素都能在该行任意一列中找到的行(元素可分布在同一列或不同列)。你之前的代码错误使用了if_all,它要求每一列都满足条件,这和需求不符。
正确实现方法
依赖包
需要加载dplyr和stringr包:
library(dplyr) library(stringr)
方法1:使用rowwise() + c_across()
这种方法直观易懂,按行处理每一行的数据:
test <- data.frame(x = c("foo", "ww12", "foo", "foo bar"), y = c("bar", "bar", "ww12", "www"), z = c(1, 2, 3, 4)) testString <- c("foo", "bar") test %>% rowwise() %>% # 检查testString的每个元素是否存在于当前行的任意列中,且所有元素都满足 filter(all(map_lgl(testString, ~any(str_detect(c_across(everything()), .x))))) %>% ungroup() # 取消行分组,恢复数据框默认结构
方法2:使用pmap_lgl()
无需行分组,直接逐行映射处理:
test %>% filter(pmap_lgl(., ~all(map_lgl(testString, ~any(str_detect(c(...), .x))))))
结果验证
运行上述代码后,会得到期望的第1行和第4行:
x y z 1 foo bar 1 2 foo bar www 4
适配单个元素的情况
如果testString是单个字符串(比如testString <- "foo"),代码同样有效,会筛选出所有包含"foo"的行(第1、3、4行)。
内容的提问来源于stack exchange,提问作者anorlondo
相关产品推荐
相关产品推荐

