DataFrames.jl为缺失值实现NA
:
help?> NA
NA
A value denoting missingness within the domain of any type.
尽管如此,朱莉娅已经有了NaN类型:
help?> NaN
NaN
A not-a-number value of type Float64.
这个设计决定的原因是什么?
答案 0 :(得分:2)
所有编程语言答案:
NA
表示缺失值。
NaN
表示未明确定义的算术运算。
根据定义,它们是不同的,因此有两种不同的东西"需要描述它们。
例如,考虑n/n
的序列n = ..., -2, -1, 0, 1, 2, ...
。在此序列中,当n = 0
时,序列元素为0/0
,其定义不明确,因此评估为NaN
。但在任何意义上,0/0
都不会缺少序列NA
的元素,因此a, b, NA, d
在这种情况下是不合适的。
对比的例子是来自某些环境传感器c
的观察序列。传感器在第三次观察时出现故障,因此记录为缺失。尽管如此,在第三次观察时,传感器应该记录的一些真值[{1}}如果没有发生故障,那么算术上也很明确。
所有你需要的东西"东西"发生在同一数据集中的是一些可能发生丢失数据的设置,以及在某些情况下可能在算术上没有明确定义的观察。紧随其后的是NaN
,NA
需要与众不同。
Julia特定答案: NaN
属于Float64
类型。但是,如果您的数据集属于其他类型,例如Int
或String
,该怎么办?如果我们使用NaN
表示缺少数据,那么您的数据集需要是一个联合类型数组,例如Union{Int, Float64}
或Union{String, Float64}
,这意味着性能将受到影响(请参阅性能提示部分官方文件讨论联盟类型)。相比之下,已经完成了大量工作(从内存开始,最终在v0.6中),以确保NA
可用于表示许多不同类型的数组中的缺失数据,而不会造成太多性能损失。这是如何实现的?这绝对是一个不同(但有趣)的问题,老实说,我认为我没有资格回答这个问题。