使用dplyr过滤data.frame不含-99997的行失败,求排查解决
问题原因及解决方法
核心问题:逻辑运算符使用错误
你在filter()里用了&&,这是标量逻辑运算符——它只会比较两个向量的第一个元素,返回单个TRUE/FALSE结果,而非逐行判断每一行的条件。
你的原数据中,第一行mannen == -99997为TRUE,vrouwen == -99997为FALSE,!(TRUE) && !(FALSE)计算后是FALSE && TRUE,最终结果为FALSE。filter()会基于这个单一结果过滤所有行,自然得不到预期的1行数据。
而dplyr的filter()需要向量式逻辑运算符&,它会逐行对每个元素做逻辑判断,返回和数据行数一致的逻辑向量,才能正确筛选符合条件的行。
正确代码写法
方法一:替换&&为&
df_filter <- df_test %>% filter(!(mannen == -99997) & !(vrouwen == -99997))
方法二:更简洁的等价写法
直接用不等于运算符连接条件,逻辑更清晰:
df_filter <- df_test %>% filter(mannen != -99997 & vrouwen != -99997)
方法三:多列通用写法(无需逐个列名)
如果数据有大量列需要排除-99997,用dplyr的if_all()(需dplyr 1.0.0及以上版本)更高效:
df_filter <- df_test %>% filter(if_all(everything(), ~ .x != -99997))
everything()表示选中所有列,~ .x != -99997定义每列的判断规则,if_all()要求所有列都满足条件才保留该行,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Henk Straten
相关产品推荐
相关产品推荐

