处理缺失值

现实世界中的数据经常包含缺失值,用 NA 表示。下面的数值向量就是一个简单的例子:
x <- c(-2, -3, NA, 2, 3, 1, NA, 0, 1, NA, 2)
对缺失值进行算术运算也会产生缺失值:
x + 2
## [1] 0 -1 NA 4 5 3 NA 2 3 NA 4
类似地,进行逻辑运算时,若考虑到缺失值,返回的逻辑向量中就不仅有 TRUE 和 FALSE,
还会有 NA,用以表示未知真实性的值。
x > 2
## [1] FALSE FALSE NA FALSE TRUE FALSE NA FALSE FALSE
## [10] NA FALSE
因此,逻辑聚合函数,例如 any( )和 all( ) 也需要处理缺失值:
x
## [1] -2 -3 NA 2 3 1 NA 0 1 NA 2
any(x > 2)
## [1] TRUE
any(x < -2)
## [1] TRUE
any(x < -3)
## [1] NA
上述输出结果展示了 any( )在处理包含缺失值的逻辑向量时的默认行为。具体来说,
只要输入向量中有任何一个元素是 TRUE,函数就返回 TRUE;如果输入向量中没有元素
为 TRUE,并且包含缺失值,则函数返回 NA;另外,如果输入向量只包含 FALSE,则函数
返回 FALSE。为了验证这个逻辑,只需运行以下代码:
any(c(TRUE, FALSE, NA))
## [1] TRUE
any(c(FALSE, FALSE, NA))
## [1] NA
any(c(FALSE, FALSE))
## [1] FALSE
若想直接忽略所有缺失值,只需在调用函数时指定 na.rm = TRUE:
any(x < -3, na.rm = TRUE)
## [1] FALSE
一个适用于 all( )的简单但相反的逻辑:
x
## [1] -2 -3 NA 2 3 1 NA 0 1 NA 2
all(x > -3)
## [1] FALSE
all(x >= -3)
## [1] NA
all(x < 4)
## [1] NA
只要输入向量中有任何一个元素是 FALSE,则函数返回 FALSE。如果输入向量中没有
元素为 FALSE,并且包含缺失值,则函数返回 NA;另外,如果输入向量只包含 TRUE,则
函数返回 TRUE。为了验证这个逻辑,只需运行以下代码:
all(c(TRUE, FALSE, NA))
## [1] FALSE
all(c(TRUE, TRUE, NA))
## [1] NA
all(c(TRUE, TRUE))
## [1] TRUE
类似地,na.rm = TRUE 使函数直接忽略所有缺失值:
all(x >= -3, na.rm = TRUE)
## [1] TRUE
当包含缺失值时,除了逻辑聚合函数,数据筛选也会有所不同。例如,下述代码在根
据 x >= 0 产生的逻辑向量来筛选数据时,返回值的对应位置保留了缺失值:
x
## [1] -2 -3 NA 2 3 1 NA 0 1 NA 2
x[x >= 0]
## [1] NA 2 3 1 NA 0 1 NA 2
相反,which( )不会保留输入逻辑向量中的缺失值:
which(x >= 0)
## [1] 4 5 6 8 9 11
因此,根据索引构建的向量子集不包含缺失值:
x[which(x >= 0)]
## [1] 2 3 1 0 1 2

posted @ 2019-01-22 11:08  NAVYSUMMER  阅读(134)  评论(0编辑  收藏  举报
交流群 编程书籍