R tidyverse中结合filter、across与str_detect筛选多列符合条件行
问题解答
错误原因
你编写的代码逻辑是要求col1、col2、col3三列同时满足值以"A"开头才会被筛选保留,你的数据集里没有符合该条件的行,因此返回空结果。
原因是filter()直接搭配across()时,对多列返回的逻辑向量默认取交集(AND)逻辑,而你需要的是并集(OR)逻辑:任意一列满足条件即可保留行。
正确实现方式
你可以对across返回的逻辑矩阵按行统计符合条件的列数,只要统计值≥1就保留该行,实现代码如下,完全符合你要求的filter、across、str_detect三个函数的使用规范:
library(dplyr) library(stringr) df %>% filter(rowSums(across(c(col1, col2, col3), ~str_detect(., "^A"))) > 0)
如果你使用的是dplyr 1.0.4及以上版本,也可以使用更简洁的if_any()写法,底层同样基于across实现行维度的逻辑判断:
df %>% filter(if_any(c(col1, col2, col3), ~str_detect(., "^A")))
两种写法运行后都可以得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

