缺失值在统计和数据分析中起着重要作用。通常,不能简单的忽略缺失值,而应该仔细研究它们,以了解是否存在潜在的模式或缺失的原因。
两种缺失值
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)
再创建一个包含1000
个NA
的向量:
> 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
会被表示为数字1
,FALSE
会被表示为数字0
。因此,如果我们取一堆TRUE
和FALSE
的总和,我们将得出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
表示。