使用 na.rm=TRUE 时移除 NaN
Posted
技术标签:
【中文标题】使用 na.rm=TRUE 时移除 NaN【英文标题】:NaN is removed when using na.rm=TRUE 【发布时间】:2013-04-08 08:24:42 【问题描述】:这个可重现的例子是我的代码的一个非常简化的版本:
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:我在 Windows7 上使用的是 64 位 R 版本 3.0.0。
编辑:
经过进一步研究,我发现is.na
也为NaN
返回真!这让我感到困惑。
is.na(NaN)
> TRUE
【问题讨论】:
【参考方案1】:这是一个语言决定:
> is.na(NaN)
[1] TRUE
is.nan
区分:
> is.nan(NaN)
[1] TRUE
> is.nan(NA)
[1] FALSE
所以你可能需要同时调用两者。
【讨论】:
是的,我刚刚注意到这种行为。我对缺失值的看法需要改变。 @e4e5f4 如果我在设计语言,我可能不会选择这种行为。但事实就是如此。 有趣的是,sum
的帮助声明 na.rm = TRUE
将删除 NaN
和 NA
(而 ?Extremes
)不会。
还有兴趣:class(NA) == "logical";类(NaN)==“数字”。
@neilfws 这是一种方便,也是另一种语言决定。试试class(NA_real_)
。【参考方案2】:
函数中的na.rm
参数通常使用is.na()
或类似的函数。
从is.na(NaN) == TRUE
开始,你就会得到你正在观察的行为。
现在应该 NaN 也被视为 NA?那是一个不同的问题;)
解决这个问题的最好方法是明确告诉R
如何处理NaN
一个例子:
ifelse(any(is.nan(x)), NaN, min(x, na.rm=TRUE))
【讨论】:
以上是关于使用 na.rm=TRUE 时移除 NaN的主要内容,如果未能解决你的问题,请参考以下文章