【问题标题】:NaN is removed when using na.rm=TRUE使用 na.rm=TRUE 时移除 NaN
【发布时间】: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

【问题讨论】:

    标签: r nan na na.rm


    【解决方案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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-01
      • 2018-02-27
      • 2016-04-15
      • 2018-11-18
      • 2017-05-22
      • 2022-01-26
      • 1970-01-01
      • 2014-10-07
      相关资源
      最近更新 更多