处理NULL, NA, NaN

问题

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

方案

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

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

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

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

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

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

  1. # Is y null?
  2. is.null(y)
  3. # FALSE
  4. # Is x NA?
  5. is.na(x)
  6. # logical(0)
  7. # Warning message:
  8. # In is.na(x) : is.na() applied to non-(list or vector) of type 'NULL'

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

忽视向量汇总函数中的“坏”值

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

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

从向量中移除”坏值“

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

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

注意

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

/Manipulating data/Comparing vectors or factors with NA


原文链接:http://www.cookbook-r.com/Basics/Working_with_NULL_NA_and_NaN/