1.6 NULL、NA、NaN 的处理
1.6.1 问题
你想正确处理NULL
、NA
(Not Available)、NaN
(Not a Number)。
1.6.2 方案
你的数据有时将会存在NULL
、NA
、NaN
。处理这些数据有些不同于「正常」值,并可能需要确定性测试。
以下是这些值相比较的例子:
x <- NULL
x > 5
#> logical(0)
y <- NA
y > 5
#> [1] NA
z <- NaN
z > 5
#> [1] NA
如何测试某个变量是否是其中的一个值:
is.null(x)
#> [1] TRUE
is.na(y)
#> [1] TRUE
is.nan(z)
#> [1] TRUE
注意,NULL
不同于其他两个。NULL
意味着没有值,而 NA
和 NaN
表示有值,尽管也许是不可用的。下面有一个例子区分:
# y 是 null 吗?
is.null(y)
#> [1] FALSE
# FALSE
# x 是 NA 吗?
is.na(x)
#> logical(0)
第一个例子,检查 y
是否是 NULL
,结果 y
并不是;第二个例子,试图检查 x
是否是 NA
,但并没有值被检测。
1.6.2.1 忽视向量汇总函数中的「坏」值
如果你对包含 NA
或 NaN
的向量使用诸如 mean()
或 sum()
之类的函数,结果将返回 NA
和 NaN
,这通常没有任何意义,虽然这样的结果会提醒你有「坏」值的存在。许多函数都有 na.rm
,可以将这些值忽略。
vy <- c(1, 2, 3, NA, 5)
mean(vy)
#> [1] NA
mean(vy, na.rm = TRUE)
#> [1] 2.75
vz <- c(1, 2, 3, NaN, 5)
sum(vz)
#> [1] NaN
sum(vz, na.rm = TRUE)
#> [1] 11
# NULL不是问题,因为它不存在
vx <- c(1, 2, 3, NULL, 5)
sum(vx)
#> [1] 11
1.6.2.2 从向量中移除「坏值」
使用 is.na()
或 is.nan()
的反向函数,可以将这些值移除。
vy
#> [1] 1 2 3 NA 5
vy[!is.na(vy)]
#> [1] 1 2 3 5
vz
#> [1] 1 2 3 NaN 5
vz[!is.nan(vz)]
#> [1] 1 2 3 5
1.6.2.3 注意
也有无限值 Inf
和 -Inf
,及其相应的函数 is.finite()
和 is.infinite()
。