Arrays 索引Julia';包含NA值的数据数组

Arrays 索引Julia';包含NA值的数据数组,arrays,indexing,julia,na,Arrays,Indexing,Julia,Na,我想知道为什么用NA值索引Julia的数据数组是不可能的。 执行以下截取操作会导致错误(NAException(“无法使用包含NA值的DataArray为数组编制索引”): 如果通过将NA设置为false来更改代码段 # Indexing with NA throws an error function Base.to_index(A::DataArray) A[A.na] = false any(A.na) && throw(NAException("canno

我想知道为什么用NA值索引Julia的数据数组是不可能的。 执行以下截取操作会导致错误(NAException(“无法使用包含NA值的DataArray为数组编制索引”):

如果通过将NA设置为false来更改代码段

# 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
@timeit dm[(!isna(dm))和(dm.<3)]=1#14.55µs/圈
@timeit dm[dm.<3]=每环路1#754.79纳秒

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

假设您有三只兔子。你想把雌兔和雄兔分开放在一个笼子里。你看第一只兔子,它看起来像一只公的,所以你把它留在原地。你看第二只兔子,它看起来像一只母的,所以你把它移到另一个笼子里。你真的看不清第三只兔子。你该怎么办

视情况而定。也许你可以把性别不明的兔子留下。但是如果你把兔子分开是因为你不想让它们变成小兔子,那么你可能希望你的分析软件告诉你它不知道第三只兔子的性别

这种情况在分析数据时经常出现。在大多数病理病例中,数据是系统性缺失而不是随机缺失的。如果你要调查一群人关于毛茸茸的兔子有多大以及它们是否应该多吃,你可以比较
平均值(毛茸茸[应该多吃])
平均值(毛茸茸[!应该多吃])
。但是,如果那些真正喜欢兔子的人因为你说要吃掉它们而生气,他们可能会把第二个问题留白。如果你忽略了这一点,你就会低估那些认为兔子不应该被多吃的人的平均蓬松度,这将是一个严重的错误。这就是为什么如果缺少值,
fluffiness[!应该被吃掉\u更多]
会抛出错误的原因:这是一个信号,表明无论您试图对数据做什么,都可能不会给出正确的结果。这种情况非常糟糕,以至于人们写了一整篇关于它的论文,例如


关于兔子的事已经够多了。在编制索引时,可能会有(并且可能有一天会有)一种更简洁的方法来删除/保留所有缺失的值,但出于上述原因,这种方法将始终是显式的,而不是隐式的。就性能而言,
isna(x)&(x<3)
vs
x<3
,虽然性能有所下降,但重复索引到数组中的开销也很高,而DataArrays更增加了额外的开销。相对开销随着阵列变大而减少。如果这是代码中的一个瓶颈,那么最好的办法就是以不同的方式编写它。

假设您有三只兔子。你想把雌兔和雄兔分开放在一个笼子里。你看第一只兔子,它看起来像一只公的,所以你把它留在原地。你看第二只兔子,它看起来像一只母的,所以你把它移到另一个笼子里。你真的看不清第三只兔子。你该怎么办

视情况而定。也许你可以把性别不明的兔子留下。但是如果你把兔子分开是因为你不想让它们变成小兔子,那么你可能希望你的分析软件告诉你它不知道第三只兔子的性别

这种情况在分析数据时经常出现。在大多数病理病例中,数据是系统性缺失而不是随机缺失的。如果你要调查一群人关于毛茸茸的兔子有多大以及它们是否应该多吃,你可以比较
平均值(毛茸茸[应该多吃])
平均值(毛茸茸[!应该多吃])
。但是,如果那些真正喜欢兔子的人因为你说要吃掉它们而生气,他们可能会把第二个问题留白。如果你忽略了这一点,你就会低估那些认为兔子不应该被多吃的人的平均蓬松度,这将是一个严重的错误。这就是为什么如果缺少值,
fluffiness[!应该被吃掉\u更多]
会抛出错误的原因:这是一个信号,表明无论您试图对数据做什么,都可能不会给出正确的结果。这种情况非常糟糕,以至于人们写了一整篇关于它的论文,例如

关于兔子的事已经够多了。在编制索引时,可能会有(并且可能有一天会有)一种更简洁的方法来删除/保留所有缺失的值,但出于上述原因,这种方法将始终是显式的,而不是隐式的。就性能而言,
isna(x)&(x<3)
vs
x<3
,虽然性能有所下降,但重复索引到数组中的开销也很高,而DataArrays更增加了额外的开销。相对开销随着阵列变大而减少。如果这是代码中的一个瓶颈,那么最好的选择是以不同的方式编写它

# 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 
@timeit dm[(!isna(dm)) & (dm .< 3)] = 1  #14.55 µs per loop  
@timeit dm[dm .< 3] = 1  #754.79 ns per loop