为什么DataFrames.jl实现NA而不是使用NaN?

时间:2017-11-22 07:14:30

标签: dataframe julia

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.

这个设计决定的原因是什么?

1 个答案:

答案 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}}如果没有发生故障,那么算术上也很明确。

所有你需要的东西"东西"发生在同一数据集中的是一些可能发生丢失数据的设置,以及在某些情况下可能在算术上没有明确定义的观察。紧随其后的是NaNNA需要与众不同。

Julia特定答案: NaN属于Float64类型。但是,如果您的数据集属于其他类型,例如IntString,该怎么办?如果我们使用NaN表示缺少数据,那么您的数据集需要是一个联合类型数组,例如Union{Int, Float64}Union{String, Float64},这意味着性能将受到影响(请参阅性能提示部分官方文件讨论联盟类型)。相比之下,已经完成了大量工作(从内存开始,最终在v0.6中),以确保NA可用于表示许多不同类型的数组中的缺失数据,而不会造成太多性能损失。这是如何实现的?这绝对是一个不同(但有趣)的问题,老实说,我认为我没有资格回答这个问题。