15.2 识别缺失值

首先,我们回顾一下4.5节的内容并地一步拓展。R使用NA(不可得)代表缺失值,NaN(不是一个数)代表不可能的值。另外,符号Inf-Inf分别代表正无穷和负无穷。函数is.na()is.nan()is.infinite()可分别用来识别缺失值、不可能值和无穷值。每个返回结果都是TRUEFALSE。表15-1给出了一些示例。 表15-1 is.na()is.nan()is.infinite()函数的返回值示例

x is.na(x) is.nan(x) is.infinite(x)
x <- NA TRUE FALSE FALSE
x <- 0 / 0 TRUE TRUE FALSE
x <- 1 / 0 FALSE FALSE TRUE

这些函数返回的对象与其自身参数的个数相同。若每个元素的类型检验通过,则由TRUE替换,否则用FALSE替换。例如,令y <- c(1, 2, 3, NA),则is.na(y)返回向量c(FALSE, FALSE, FALSE, TRUE)

函数complete.cases()可用来识别矩阵或数据框中没有缺失值的行。若每行都包含完整的实例,则返回TRUE的逻辑向量;若每行有一个或多个缺失值,则返回FALSE

以睡眠数据集为例:

  1. # 加载数据集
  2. data(sleep, package="VIM")
  3. # 列出没有缺失值的行
  4. sleep[complete.cases(sleep),]
  5. # 列出有一个或多个缺失值的行
  6. sleep[!complete.cases(sleep),]

输出结果显示42个实例为完整数据,20个实例含一个或多个缺失值。

由于逻辑值TRUEFALSE分别等价于数值1和0,可用sum()mean()函数来获取关于缺失数据的有用信息。如:

  1. > sum(is.na(sleep$Dream))
  2. [1] 12
  3. > mean(is.na(sleep$Dream))
  4. [1] 0.19
  5. > mean(!complete.cases(sleep))
  6. [1] 0.32

结果表明变量Dream有12个缺失值,19%的实例在此变量上有缺失值。另外,数据集中32%的实例包含一个或多个缺失值。

对于识别缺失值,有两点需要牢记。第一点,complete.cases()函数仅将NANaN识别为缺失值,无穷值(Inf-Inf)被当做有效值。第二点,必须使用与本章中类似的缺失值函数来识别R数据对象中的缺失值。像myvar == NA这样的逻辑比较无法实现。

现在你应该懂得了如何用程序识别缺失值,接下来学习一些有助于发现缺失值模式的工具。