处理NULL, NA, NaN
问题
你想正确处理NULL、NA (Not Available)、NaN(Not a Number)。
方案
你的数据有时将会存在NULL、NA 、NaN。处理这些数据有些不同于”正常”值,并可能需要确定性测试。
以下是这些值相比较的例子:
x <- NULLx > 5# logical(0)y <- NAy > 5# NAz <- NaNz > 5# NA
如何测试某个变量是否是其中的一个值:
is.null(x)# TRUEis.na(y)# TRUEis.nan(z)# TRUE
注意,NULL不同于其他两个。NULL意味着没有值,而NA和NaN表示有价,尽管也许是不可用的。下面有一个例子区分:
# Is y null?is.null(y)# FALSE# Is x NA?is.na(x)# logical(0)# Warning message:# In is.na(x) : is.na() applied to non-(list or vector) of type 'NULL'
第一个例子,检查y是否是NULL,结果y并不是;第二个例子,试图检查x是否是NA,但并没有值被检测。
忽视向量汇总函数中的“坏”值
如果你对包含NA或NaN的向量使用诸如mean()或sum()之类的函数,结果将返回NA和NaN,这通常没有任何意义,虽然这样的结果会提醒你有“坏”值的存在。许多函数都有na.rm可以将这些值忽略。
vy <- c(1, 2, 3, NA, 5)# 1 2 3 NA 5mean(vy)# NAmean(vy, na.rm=TRUE)# 2.75vz <- c(1, 2, 3, NaN, 5)# 1 2 3 NaN 5sum(vz)# NaNsum(vz, na.rm=TRUE)# 11# NULL不是问题,因为它不存在vx <- c(1, 2, 3, NULL, 5)# 1 2 3 5sum(vx)# 11
从向量中移除”坏值“
使用is.na()或is.nan()的反向函数,可以将这些值移除。
vy# 1 2 3 NA 5vy[!is.na(vy)]# 1 2 3 5vz# 1 2 3 NaN 5vz[!is.nan(vz)]# 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/
