15.2 识别缺失值
首先,我们回顾一下4.5节的内容并地一步拓展。R使用NA
(不可得)代表缺失值,NaN
(不是一个数)代表不可能的值。另外,符号Inf
和-Inf
分别代表正无穷和负无穷。函数is.na()
、is.nan()
和is.infinite()
可分别用来识别缺失值、不可能值和无穷值。每个返回结果都是TRUE
或FALSE
。表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
。
以睡眠数据集为例:
# 加载数据集
data(sleep, package="VIM")
# 列出没有缺失值的行
sleep[complete.cases(sleep),]
# 列出有一个或多个缺失值的行
sleep[!complete.cases(sleep),]
输出结果显示42个实例为完整数据,20个实例含一个或多个缺失值。
由于逻辑值TRUE
和FALSE
分别等价于数值1和0,可用sum()
和mean()
函数来获取关于缺失数据的有用信息。如:
> sum(is.na(sleep$Dream))
[1] 12
> mean(is.na(sleep$Dream))
[1] 0.19
> mean(!complete.cases(sleep))
[1] 0.32
结果表明变量Dream
有12个缺失值,19%的实例在此变量上有缺失值。另外,数据集中32%的实例包含一个或多个缺失值。
对于识别缺失值,有两点需要牢记。第一点,complete.cases()
函数仅将NA
和NaN
识别为缺失值,无穷值(Inf
和-Inf
)被当做有效值。第二点,必须使用与本章中类似的缺失值函数来识别R数据对象中的缺失值。像myvar == NA
这样的逻辑比较无法实现。
现在你应该懂得了如何用程序识别缺失值,接下来学习一些有助于发现缺失值模式的工具。