【问题标题】:Indexing Julia's DataArrays with included NA values使用包含的 NA 值索引 Julia 的 DataArrays
【发布时间】:2016-10-04 18:13:18
【问题描述】:

我想知道为什么用 NA 值索引 Julia 的 DataArrays 是不可能的。 执行下面的剪辑会导致错误(NAException(“无法使用包含 NA 值的 DataArray 索引数组”)):

dm = data([1 4 7; 2 5 8; 3 1 9])
dm[dm .== 5] = NA

dm[dm .< 3] = 1  #Error
dm[(!isna(dm)) & (dm .< 3)] = 1  #Working

有一个解决方案可以忽略带有isna() 的DataFrame 中的NA,例如回答here。乍一看,它的工作方式与它应该的一样,忽略 DataFrames 中的 NA 与 DataArrays 的方法相同,因为 DataFrame 的每一列都是一个 DataArray,如here 所述。但在我看来,在每种情况下忽略 !isna() 的缺失值并不是最好的解决方案。

对我来说,不清楚为什么包含 NA 时 DataFrame 模块会引发错误。如果索引所需的布尔数组具有 NA 值,则该值应转换为 false,就像 MATLAB® 或 Pythons Pandas 一样。在indexing.jl 的DataArray 模块源代码(如下所示)中,有一个明确的函数可以抛出NAException:

# Indexing with NA throws an error
function Base.to_index(A::DataArray)
    any(A.na) && throw(NAException("cannot index an array with a DataArray containing NA values"))
    Base.to_index(A.data)
end

如果您通过将 NA 设置为 false 来更改 sn-p ...

# Indexing with NA throws an error
function Base.to_index(A::DataArray)
    A[A.na] = false
    any(A.na) && throw(NAException("cannot index an array with a DataArray containing NA values"))
    Base.to_index(A.data)
end 

...dm[dm .&lt; 3] = 1 工作正常(就像在 MATLAB® 或 Pandas 中一样)。

对我来说,如果索引中包含 NA,则自动抛出错误是没有意义的。至少应该有一个参数创建 DataArray 让用户选择是否忽略 NA。有两个重要的原因:一方面,当你有很多索引和 NA 值的公式时(例如计算气象网格模型),编写和阅读代码不是很愉快,另一方面,有一个明显的损失本次测试显示的性能:

@timeit dm[(!isna(dm)) & (dm .< 3)] = 1  #14.55 µs per loop  
@timeit dm[dm .< 3] = 1  #754.79 ns per loop

开发人员使用此异常的原因是什么?是否有另一种更简单的方法,如 !isna() 来忽略 DataArrays 中的 NA?

【问题讨论】:

    标签: arrays indexing julia na


    【解决方案1】:

    假设你有三只兔子。你想把雌兔和雄兔放在一个单独的笼子里。你看第一只兔子,它看起来像一只雄性,所以你把它留在原处。你看第二只兔子,它看起来像一只雌性,所以你把它移到单独的笼子里。你不能真正看清楚第三只兔子。你应该怎么做?

    这取决于。也许你可以把未知性别的兔子抛在脑后。但是,如果您因为不想让兔子制造小兔子而将它们分离出来,那么您可能希望您的分析软件告诉您它不知道第三只兔子的性别。

    在分析数据时经常会出现这种情况。在最病态的情况下,数据会系统地而不是随机地丢失。如果你要调查一群人关于兔子有多蓬松以及是否应该多吃,你可以比较mean(fluffiness[should_be_eaten_more])mean(fluffiness[!should_be_eaten_more])。但是,如果真正喜欢兔子的人对你说要吃兔子感到愤怒,他们可能会将第二个问题留空。如果你忽略这一点,你会低估那些认为不应该多吃兔子的人的平均蓬松度,这将是一个严重的错误。这就是为什么fluffiness[!should_be_eaten_more] 会在缺少值时抛出错误的原因:这表明无论您尝试对数据做什么都可能不会给出正确的结果。这种情况已经够糟糕了,以至于人们写了整篇关于它的论文,例如this one.

    关于兔子就够了。可能应该(并且可能有一天会)有一种更简洁的方法来在索引时删除/保留所有缺失值,但由于上述原因,它始终是显式的而不是隐式的。就性能而言,虽然 isna(x) &amp; (x &lt; 3)x &lt; 3 的性能有所下降,但重复索引到数组的开销也很高,而且 DataArrays 在此基础上增加了额外的开销。随着阵列变大,相对开销会降低。如果这是您代码中的瓶颈,最好的办法是用不同的方式编写它。

    【讨论】:

      猜你喜欢
      • 2018-12-06
      • 2018-11-17
      • 2018-07-29
      • 2020-08-09
      • 1970-01-01
      • 2019-09-20
      • 2010-10-19
      • 1970-01-01
      • 2020-07-31
      相关资源
      最近更新 更多