1.6 NULL、NA、NaN 的处理

1.6.1 问题

你想正确处理NULLNA (Not Available)、NaN(Not a Number)。

1.6.2 方案

你的数据有时将会存在NULLNANaN。处理这些数据有些不同于「正常」值,并可能需要确定性测试。

以下是这些值相比较的例子:

  1. x <- NULL
  2. x > 5
  3. #> logical(0)
  4. y <- NA
  5. y > 5
  6. #> [1] NA
  7. z <- NaN
  8. z > 5
  9. #> [1] NA

如何测试某个变量是否是其中的一个值:

  1. is.null(x)
  2. #> [1] TRUE
  3. is.na(y)
  4. #> [1] TRUE
  5. is.nan(z)
  6. #> [1] TRUE

注意,NULL 不同于其他两个。NULL 意味着没有值,而 NANaN 表示有值,尽管也许是不可用的。下面有一个例子区分:

  1. # y 是 null 吗?
  2. is.null(y)
  3. #> [1] FALSE
  4. # FALSE
  5. # x 是 NA 吗?
  6. is.na(x)
  7. #> logical(0)

第一个例子,检查 y 是否是 NULL ,结果 y 并不是;第二个例子,试图检查 x 是否是 NA,但并没有值被检测。

1.6.2.1 忽视向量汇总函数中的「坏」值

如果你对包含 NANaN 的向量使用诸如 mean()sum() 之类的函数,结果将返回 NANaN,这通常没有任何意义,虽然这样的结果会提醒你有「坏」值的存在。许多函数都有 na.rm,可以将这些值忽略。

  1. vy <- c(1, 2, 3, NA, 5)
  2. mean(vy)
  3. #> [1] NA
  4. mean(vy, na.rm = TRUE)
  5. #> [1] 2.75
  6. vz <- c(1, 2, 3, NaN, 5)
  7. sum(vz)
  8. #> [1] NaN
  9. sum(vz, na.rm = TRUE)
  10. #> [1] 11
  11. # NULL不是问题,因为它不存在
  12. vx <- c(1, 2, 3, NULL, 5)
  13. sum(vx)
  14. #> [1] 11

1.6.2.2 从向量中移除「坏值」

使用 is.na()is.nan() 的反向函数,可以将这些值移除。

  1. vy
  2. #> [1] 1 2 3 NA 5
  3. vy[!is.na(vy)]
  4. #> [1] 1 2 3 5
  5. vz
  6. #> [1] 1 2 3 NaN 5
  7. vz[!is.nan(vz)]
  8. #> [1] 1 2 3 5

1.6.2.3 注意

也有无限值 Inf-Inf,及其相应的函数 is.finite()is.infinite()