貢獻者: 馬柑鈴
問題
你想正確處理NULL、NA (Not Available)、NaN(Not a Number)。
方案
你的數(shù)據(jù)有時將會存在NULL、NA 、NaN。處理這些數(shù)據(jù)有些不同于”正?!敝?,并可能需要確定性測試。
以下是這些值相比較的例子:
x <- NULL
x > 5
# logical(0)
y <- NA
y > 5
# NA
z <- NaN
z > 5
# NA
如何測試某個變量是否是其中的一個值:
is.null(x)
# TRUE
is.na(y)
# TRUE
is.nan(z)
# TRUE
注意,NULL不同于其他兩個。NULL意味著沒有值,而NA和NaN表示有價,盡管也許是不可用的。下面有一個例子區(qū)分:
# 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,結(jié)果y并不是;第二個例子,試圖檢查x是否是NA,但并沒有值被檢測。
忽視向量匯總函數(shù)中的“壞”值
如果你對包含NA或NaN的向量使用諸如mean()或sum()之類的函數(shù),結(jié)果將返回NA和NaN,這通常沒有任何意義,雖然這樣的結(jié)果會提醒你有“壞”值的存在。許多函數(shù)都有na.rm可以將這些值忽略。
vy <- c(1, 2, 3, NA, 5)
# 1 2 3 NA 5
mean(vy)
# NA
mean(vy, na.rm=TRUE)
# 2.75
vz <- c(1, 2, 3, NaN, 5)
# 1 2 3 NaN 5
sum(vz)
# NaN
sum(vz, na.rm=TRUE)
# 11
# NULL不是問題,因為它不存在
vx <- c(1, 2, 3, NULL, 5)
# 1 2 3 5
sum(vx)
# 11
從向量中移除”壞值“
使用is.na()或is.nan()的反向函數(shù),可以將這些值移除。
vy
# 1 2 3 NA 5
vy[!is.na(vy)]
# 1 2 3 5
vz
# 1 2 3 NaN 5
vz[!is.nan(vz)]
# 1 2 3 5
注意
也有無限值Inf和-Inf,及其相應(yīng)的函數(shù)is.finite()和is.infinite()。
見/Manipulating data/Comparing vectors or factors with NA
原文鏈接:http://www.cookbook-r.com/Basics/Working_with_NULL_NA_and_NaN/