使用 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 将删除 NaNNA(而 ?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的主要内容,如果未能解决你的问题,请参考以下文章

遍历 NodeList 时移除 DOM 节点

添加时移除图像的组件

在 iOS 上使用 setBackgroundImage 时移除 UIButton 的阴影

在框架外点击时移除视图

在外面点击时移除视图

ViewDeck 在设置中心控制器时移除导航栏