貢獻者: 馬柑鈴
問題
你想正確處理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/