【发布时间】: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 .< 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?
【问题讨论】: