gpt4 book ai didi

r - 为什么我在 Julia 中使用 dropmissing 或 skipmissing 会得到不同的结果?

转载 作者:行者123 更新时间:2023-12-05 04:28:04 30 4
gpt4 key购买 nike

我正在尝试使用 DataFrames 和 DataFramesMeta(这是来自 nycflights2013 的航类子数据集)在 Julia 中模拟以下 R 代码(使用 dplyr):

flights %>%
group_by(month, origin, dest) %>%
summarise(retard_moyen = mean(dep_delay, na.rm = TRUE)) %>%
group_by(month) %>%
slice_max(retard_moyen)

#> month origin dest retard_moyen
#> <int> <chr> <chr> <dbl>
#> 1 1 EWR TUL 55.2
#> 2 2 EWR DSM 48.6
#> 3 3 EWR DSM 71.0
#> 4 4 EWR OKC 47.0
#> 5 5 EWR TYS 60.6
#> 6 6 EWR TYS 68.2
#> 7 7 EWR CAE 81.5
#> 8 8 LGA GSO 50.1
#> 9 9 LGA MSN 24.7
#> 10 10 EWR CAE 50.1
#> 11 11 LGA SBN 67.5
#> 12 12 EWR BZN 75

但是根据 skipmissing 或 dropmissing 的使用,我得到了两个不同的结果。使用 dropmissing 版本我得到与上面的 R 代码完全相同的结果,而使用 skipmissing 我在取平均值时得到一些 NaN 值并且结果缺少两个月......这是两个代码:

# using skipmissing

@chain flights begin
groupby([:month, :origin, :dest])
@combine :mean_delay = mean(skipmissing(:dep_delay))
groupby(:month)
@subset(:mean_delay .== maximum(:mean_delay))
sort(:month)
end

10×4 DataFrame
Row │ month origin dest mean_delay
│ Int64 String String Float64
─────┼───────────────────────────────────
1 │ 1 EWR TUL 55.2222
2 │ 2 EWR DSM 48.5652
3 │ 3 EWR DSM 71.0385
4 │ 4 EWR OKC 46.9643
5 │ 5 EWR TYS 60.5556
6 │ 6 EWR TYS 68.2414
7 │ 8 LGA GSO 50.1111
8 │ 10 EWR CAE 50.1111
9 │ 11 LGA SBN 67.5
10 │ 12 EWR BZN 75.0


# using dropmissing

@chain flights begin
dropmissing(:dep_delay)
groupby([:month, :origin, :dest])
@combine :mean_delay = mean(:dep_delay)
groupby(:month)
@subset(:mean_delay .== maximum(:mean_delay))
sort(:month)
end

12×4 DataFrame
Row │ month origin dest mean_delay
│ Int64 String String Float64
─────┼───────────────────────────────────
1 │ 1 EWR TUL 55.2222
2 │ 2 EWR DSM 48.5652
3 │ 3 EWR DSM 71.0385
4 │ 4 EWR OKC 46.9643
5 │ 5 EWR TYS 60.5556
6 │ 6 EWR TYS 68.2414
7 │ 7 EWR CAE 81.5
8 │ 8 LGA GSO 50.1111
9 │ 9 LGA MSN 24.6905
10 │ 10 EWR CAE 50.1111
11 │ 11 LGA SBN 67.5
12 │ 12 EWR BZN 75.0

有人知道这种行为吗?谢谢。

最佳答案

第一个转换操作应该是:

julia> @chain flights begin
groupby([:month, :origin, :dest])
@combine :mean_delay = mean(skipmissing(:dep_delay))
groupby(:month)
@subset(:mean_delay .== maximum(filter(!isnan, :mean_delay)))
sort(:month)
end

请注意,我在 @subset 部分添加了 filter

需要它的原因是什么? [:month, :origin, :dest] 的某些组合在 :dep_delay 中只有缺失值,在这种情况下,您有:

julia> mean(skipmissing(missings(Float64, 3)))
NaN

于是产生了NaN。然后你有:

julia> maximum([1, 2, NaN])
NaN

所以如果对于某些 :month 至少有一个 NaN 产生它被静静地丢弃(因为 NaN 不等于 == 到任何东西)。如果将 == 切换为例如,您可能会发现生成了 NaN ===(或isequal)比较:

@chain flights begin
groupby([:month, :origin, :dest])
@combine :mean_delay = mean(skipmissing(:dep_delay))
groupby(:month)
@subset(:mean_delay .=== maximum(:mean_delay))
sort(:month)
end

关于r - 为什么我在 Julia 中使用 dropmissing 或 skipmissing 会得到不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72681362/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com