我正在使用sum(is.na(my.df))
来检查我的数据帧是否包含任何NA,这些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对象:默认方法处理原子 vector ,列表和成对列表。is.nan()
:x要测试的R对象:默认方法处理原子 vector ,列表和成对列表。 最佳答案
从?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)
返回一个长度等于数据帧的列数的 vector ,仅当该列由单个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,
关于r - 数据帧和is.nan(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7031127/