当使用na.rm=TRUE时,NaN会被移除。

11

这个可重现的示例是我代码的一个非常简化的版本:

x <- c(NaN, 2, 3)

#This is fine, as expected
max(x)
> NaN

#Why does na.rm remove NaN?
max(x, na.rm=TRUE) 
> 3
对于我来说,缺失值NA和非数字NaN是两个完全不同的概念,为什么na.rm会移除NaN?怎样才能忽略NA而不是NaN? ps:我使用的是64位Windows7上的R版本3.0.0。
编辑:经过更深入的研究,我发现is.na也会对NaN返回true!这就是我感到困惑的原因。
is.na(NaN)
> TRUE
2个回答

8

这是一个语言决定:

> is.na(NaN)
[1] TRUE

is.nan有所不同:

> is.nan(NaN)
[1] TRUE
> is.nan(NA)
[1] FALSE

所以你可能需要同时调用两个。

是的,我刚注意到这种行为。我对缺失值的理解需要改变。 - Nishanth
@e4e5f4 如果我设计这门语言,我可能不会选择这种行为。但事实就是这样。 - Matthew Lundberg
1
有趣的是,sum 的帮助文档指出 na.rm = TRUE 将删除 NaNNA(而 ?Extremes 则不会)。 - mnel
3
有趣的是:class(NA) == "logical"; class(NaN) == "numeric"。 - neilfws
@neilfws 这是一种方便的方式,也是另一种语言决策。尝试使用class(NA_real_) - Matthew Lundberg

3

na.rm参数在函数中通常使用is.na()或类似的函数。
由于is.na(NaN) == TRUE,所以你观察到的就是这种行为。

现在问题是:NaN是否也应该被视为NA?这是另一个问题;)


解决这个问题的最佳方法是明确告诉R如何处理NaN。 一个例子:

ifelse(any(is.nan(x)), NaN, min(x, na.rm=TRUE))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接