NA值异常行为解析:求R语言底层运行机制解惑
R语言NA值处理的核心机制解惑
疑问1:complete.cases/na.omit后行数远低于预期的原因
complete.cases()和na.omit()的核心逻辑是保留所有列都没有NA的行,而非基于总NA数做减法。
你提到总NA数不足15000,但这15000个NA可能分散在大量行中——比如7万多行里每行仅包含1个NA,总NA数加起来不到15000,但这些行都会被complete.cases()剔除。最终剩下的14186行,是整个数据框中所有29列都完全没有NA值的行,这和总NA数的计算逻辑完全不同,所以会远少于90797-15000的预期值。
疑问2:dplyr汇总未设na.rm=T却未返回NA的原因
看你的代码,filter()步骤里有Channel_1_qty > 0的条件:
filter(Season %in% c("FW2022", "SS2023") & (Channel_1_qty > 0))
在R的逻辑运算中,NA和任何值比较都会返回NA,而filter()会自动剔除所有返回NA的行。也就是说,所有Channel_1_qty为NA的行,在这一步就已经被过滤掉了,后续summarise()中的sum(Channel_1_qty)处理的都是非NA的有效值,自然不需要na.rm=T也不会返回NA。
为什么先做complete.cases会比直接filter得到更少的行
complete.cases()要求数据框的所有列都没有NA,而你的filter()只关注Season和Channel_1_qty两个列的条件——即使其他列存在NA,只要Season符合指定值且Channel_1_qty>0,这些行依然会被filter()保留。但如果先运行complete.cases(),这些“其他列有NA但符合filter条件”的行都会被剔除,最终得到的行数自然远少于直接filter后的结果。
内容的提问来源于stack exchange,提问作者cigarettes_after_text
相关产品推荐
相关产品推荐

