dplyr::filter中多组if_all()联用不生效问题排查与解决
问题原因及解决方案
错误原因
你的代码里if_all(yes) == 1和if_all(no) == 0是错误的用法:
if_all()的默认行为是检查列值是否为逻辑真(数值型的1会被视为TRUE,0视为FALSE),直接写if_all(yes)等价于if_all(yes, ~ .x)。- 当你把
if_all()的结果(逻辑向量)和数值1/0比较时,会自动把逻辑值转成数值(TRUE=1,FALSE=0),这就导致逻辑判断完全偏离预期:- 对于
no列的条件if_all(no) ==0,只要no列不全为1(即不全是TRUE),这个判断就会返回TRUE——比如第3行的pub=1、sco=0,if_all(no)返回FALSE,转成数值0后等于0,所以条件成立,这就是为什么pub=1的行被错误保留了。
- 对于
正确写法
你需要给if_all()传入明确的条件函数,指定列值等于1或0:
yes <- c("dim", "wos") # 这些列的值应为1 no <- c("pub", "sco") # 这些列的值应为0 df %>% dplyr::filter(if_all(yes, ~ .x == 1) & if_all(no, ~ .x == 0))
运行后会得到正确结果:仅保留第1、2行(移除了pub=1的第3、4行)。
也可以用dplyr::equals()让代码更简洁:
df %>% dplyr::filter(if_all(yes, equals(1)) & if_all(no, equals(0)))
内容的提问来源于stack exchange,提问作者anpami
相关产品推荐
相关产品推荐

