我正在使用sum(is.na(my.df))
检查我的数据框是否包含任何按预期工作的NA,但sum(is.nan(my.df))
没有按预期工作。
> my.df <- data.frame(a=c(1, 2, 3), b=c(5, NA, NaN))
> my.df
a b
1 1 5
2 2 NA
3 3 NaN
> is.na(my.df)
a b
[1,] FALSE FALSE
[2,] FALSE TRUE
[3,] FALSE TRUE
> is.nan(my.df)
a b
FALSE FALSE
> sum(is.na(my.df))
[1] 2
> sum(is.nan(my.df))
[1] 0
亲爱的,亲爱的。
是否存在行为不一致的原因?是因为缺乏实施,还是故意的? is.nan(my.df)
的返回值表示什么?是否有充分的理由不在整个数据框架上使用is.nan()
?
在is.na( )
和is.nan( )
的文档中,参数类型看起来相同(尽管它们没有专门列出数据框):
is.na()
:x要测试的R对象:默认方法处理原子向量,列表和pairlists。
is.nan()
:x要测试的R对象:默认方法处理原子向量,列表和pairlists。
答案 0 :(得分:18)
来自?is.nan
:
All elements of logical,integer and raw vectors are considered not to be NaN, and
elements of lists and pairlists are also unless the element is a length-one numeric
or complex vector whose single element is NaN.
数据框的列在技术上是“列表的元素”,因此is.nan(df)
返回一个长度等于数据帧列数的向量,只有TRUE
列由单个NaN
元素组成:
> is.nan(data.frame(a=NaN,b=NA,c=1))
a b c
TRUE FALSE FALSE
如果您希望行为与is.na
匹配,请使用apply
:
sum(apply(my.df,2,is.nan))
答案是1而不是2,因为is.nan(NA)
是FALSE
...
编辑:或者,您只需将数据框转换为矩阵:
sum(is.nan(as.matrix(my.df)))
更新:此问题在提出问题后很快(两个月)发生变化,在R版本2.14(2011年10月)中:来自NEWS file,
o is.finite(),is.infinite()和is.nan()的默认方法现在发出错误,如果它们的参数不是原子向量。
答案 1 :(得分:1)
由于某些奇怪的原因,is.nan
函数不适用于列表。它为何与is.na
不同的原因已经超出我的范围,并且似乎是语言设计问题。但是,有一个简单的解决方案:
df <- data.frame(a=c(1, 2, 3), b=c(5, NA, NaN))
df <- data.frame(sapply(df, function(x) ifelse(is.nan(x), NA, x)))
df
a b
1 1 5
2 2 NA
3 3 NA