You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 10:36:43