缺失值在统计和数据分析中起着重要作用。通常,不能简单的忽略缺失值,而应该仔细研究它们,以了解是否存在潜在的模式或缺失的原因。

两种缺失值

NA

R中,NA用于表示“不可用”或“缺失”(在统计意义上)的任何值。 在本课程中,我们将进一步探索缺失值的价值。

任何涉及NA的操作通常都会产生NA。 为了说明这一点,让我们创建一个向量c(44,NA,5,NA)并将其分配给变量x

> x <- c(44, NA, 5, NA)

看看x * 3的结果是什么:

> x * 3
[1] 132  NA  15  NA

我们可以看到结果向量里,与NA对应的元素的值也是NA

为了让事情更有趣一些,我们来创建一个向量,该向量包含1000个来自标准正态分布元素:

> y <- rnorm(1000)

再创建一个包含1000NA的向量:

> z <- rep(NA, 1000)

现在从上述2000个元素中随机抽取100个元素,我们不知道会有多少个NA会被抽到,也不知道它们的所在位置。

> my_data <- sample(c(y, z), 100)

首先让我们解决第一个问题:我们的NA在数据中的位置。 is.na()函数告诉我们向量的每个元素是否为NA。 在my_data上调用is.na()并将结果赋值给my_na

> my_na <- is.na(my_data)
> my_na
  [1]  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE
 [24]  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE
 [47]  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
 [70] FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE
 [93]  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE

在所有看到TRUE的地方,我们就知道my_data的对应元素是NA。 同样,在任何地方看到FALSE,我们就知道my_data的对应元素是我们从标准正态分布中随机抽取的元素之一。

在前面关于逻辑运算符的讨论中,我们引入了==运算符作为测试两个对象之间相等性的方法。 因此,有些人可能会认为表达式my_data == NA产生的结果与is.na()同。 可以试试看

> my_data == NA
  [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
 [48] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
 [95] NA NA NA NA NA NA

结果和is.na()不同。R返回了与my_data长度相同,但是全部都是NA的向量。为什么会这样?这是因为NA不是一个真正的值,只是一个表示缺失值的占位符。因此无法与其他值进行比较,my_data == NA这样的逻辑表达式是不完整的。R别无他法,只能返回这样以一个结果。

如果这有点令人困惑,请不要担心。 关键要点是,在任何可能出现NA的情况下使用逻辑表达式时要谨慎,因为单个NA值可能会使整个脚本出现异常。

现在,回到手头的任务。 现在我们有了一个向量my_na,它对每个NA都为TRUE,对每个数值都为FALSE,我们可以计算数据中NA的总数。

有一个小诀窍,在R中,TRUE会被表示为数字1FALSE会被表示为数字0。因此,如果我们取一堆TRUEFALSE的总和,我们将得出TRUE的总数。这种情况下,我们可以直接使用sum()函数。

> sum(my_na)
[1] 54

NaN

现在我们对NA已经有所了解,让我们看看另一种缺失值——NaN(not a number),表示非数字。可以通过这样一个例子来生成NaN

> 0 / 0
[1] NaN

还有一个有趣的例子,在R中,Inf表示无穷大,如果用Inf减去Inf,结果会是什么?

> Inf - Inf
[1] NaN

结果还是NaN

小结

  • NA表示缺失值,但它不是一个真实值,仅仅是一个占位符。所以在逻辑运算符中如果有NA,要谨慎使用。
  • 任何设计NA的操作都会产生NA
  • NaN表示非数字,比如0 / 0这样无意义的结果,就可以用NaN表示。