Julia中使用dropmissing与skipmissing为何得到不同结果?
差异原因
两种写法结果不一致的核心是skipmissing和dropmissing对全缺失值分组的处理逻辑不同,叠加NaN的比较特性导致筛选结果出错:
dropmissing(:dep_delay)在分组前执行,会直接把所有dep_delay为缺失值的行从源数据中删除。如果某组(month, origin, dest)的所有记录dep_delay都是缺失值,这组会因为没有剩余行,在分组聚合阶段直接被丢弃,不会出现在中间结果里。skipmissing(:dep_delay)在分组聚合计算均值时才执行,如果某组的dep_delay全为缺失值,skipmissing会返回空迭代器,对空集合求mean会得到NaN,这类全缺失分组会保留在中间结果中,对应mean_delay值为NaN。- 后续按月份分组筛选最大值时,只要某个月的分组中存在一个NaN值,
maximum(:mean_delay)就会直接返回NaN;而Julia中NaN和任何值做相等比较都返回false(包括NaN == NaN的结果也是false),最终这个月没有任何行满足筛选条件,就会从最终结果中消失。你结果中缺失的7月、9月,正是因为当月存在至少一组(origin, dest)的dep_delay全为缺失值,触发了上述问题。
修复方案
如果要保留skipmissing的写法,只需要在聚合后过滤掉NaN值,或者计算最大值时跳过NaN即可,结果会和R代码完全对齐:
# 方案1:聚合后移除空组产生的NaN @chain flights begin groupby([:month, :origin, :dest]) @combine :mean_delay = mean(skipmissing(:dep_delay)) filter!(:mean_delay => !isnan, _) groupby(:month) @subset(:mean_delay .== maximum(:mean_delay)) sort(:month) end # 方案2:计算月内最大值时跳过NaN @chain flights begin groupby([:month, :origin, :dest]) @combine :mean_delay = mean(skipmissing(:dep_delay)) groupby(:month) @subset(:mean_delay .== maximum(skipmissing(:mean_delay))) sort(:month) end
内容的提问来源于stack exchange,提问作者Gustavo Machala
相关产品推荐
相关产品推荐

