R语言dplyr按组筛选全为NA的行时if_all函数结果不符合预期问题
问题排查与解决
逻辑错误原因
if_all()、if_any()默认是逐行判断逻辑,仅传入单列value时,只会校验当前行的value值是否满足条件,不会统计整个分组的所有数值:- 你分组后写的
filter(!if_all(value, is.na)),实际执行逻辑是「逐行保留value不为NA的行」,和未分组时!if_any(value, is.na)的逐行过滤逻辑完全一致,因此B组内两个非NA的行也会被保留,不符合你的预期。
- 你分组后写的
- 你预期仅保留A组的全部行,实际需求是仅保留组内完全没有NA值的分组下的所有行,需要对整个分组做聚合判断,而非逐行判断。
正确实现代码
使用分组聚合函数all()判断整个组的value是否全部不为NA即可:
library(dplyr) df %>% group_by(File) %>% filter(all(!is.na(value)))
运行结果:
# A tibble: 3 × 2 # Groups: File [1] File value <chr> <dbl> 1 A 1.11 2 A 1.22 3 A 1.12
完全符合预期输出。
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

