【问题标题】:Why does any() return NA when no true values [duplicate]为什么在没有真值时 any() 返回 NA [重复]
【发布时间】:2017-02-14 12:43:09
【问题描述】:

所以我们有这种行为:

any(c(TRUE, FALSE, NA))
#> [1] TRUE
any(c(TRUE, NA))
#> [1] TRUE
any(c(FALSE, NA))
#> [1] NA

有人知道返回 NA 而不是 FALSE 的理由吗? IMO 函数应该测试是否存在非 FALSE 值,而 NA 不是。

【问题讨论】:

  • 因为FALSE|NA 返回NA
  • 来自帮助文件的值部分:“如果 x 中的至少一个值为 TRUE,则返回的值为 TRUE,如果 x 中的所有值都为 FALSE,则返回值为 FALSE(包括如果没有值)。否则值为 NA。"
  • 使用 any(na.omit(c(FALSE, NA))) 总是得到 TRUE 或 FALSE。
  • 我们在any 中也有na.rm 参数。将其设置为TRUE 以删除NA
  • 对于它的价值,如果你认为 NA 是一个未知值,R 的行为是非常明智的,因此可能是 TRUE 或 FALSE。这就是为什么c(TRUE, NA) 被确定,而c(FALSE, NA) 不是。

标签: r


【解决方案1】:

帮助文件的值部分解释了此行为:

如果 x 中的至少一个值为 TRUE,则返回值为 TRUE,如果 x 中的所有值都为 FALSE(包括没有值),则返回值为 FALSE。否则值为 NA。

正如您所注意到的,这似乎与更常用的函数(例如 summean)的行为不同,因为这些函数的向量参数中存在 NA 值会返回 NA。这个感知问题由joran's answer 澄清,参考?Logic 的文档,重新引用:

NA 是一个有效的逻辑对象。如果 x 或 y 的分量为 NA,则如果结果不明确,则结果将为 NA。换句话说,NA & TRUE 的计算结果为 NA,但 NA & FALSE 的计算结果为 FALSE。请参阅下面的示例。

因此,在模棱两可的情况下,例如,当向量包含 NA 或 NA | FALSE 的缺失值可能为 TRUE 的情况下计算均值时,NA 将是输出。而在其他情况下,例如any(c(TRUE, NA))TRUE | NA,尽管存在缺失值,但结果是明确的。这个逻辑在@Floo0 的回答和一些问题的cmets 中可能更清楚。

【讨论】:

    【解决方案2】:

    我可能记错了,但这里的逻辑是:

    NA 表示未知值。所以问题

    (FALSE, NA) 的任何值是否为真?

    回答“我不知道”又名NA,因为NA 可能是TRUE,但在您询问的那一刻是未知的。

    回答问题

    (TRUE, NA) 的任何值是否为真?

    这是用TRUE 回答的,因为第一个值肯定是TRUE

    【讨论】:

    • 这实际上是答案(发表了类似的评论,其内容实际上是@Axeman在我之前所说的)。
    • @nicola:对不起,我没有看到你的评论……你想让我删除我的答案并自己回答吗?
    • 一点也不。这个答案需要在这里,因为在我看来,接受的答案并没有强调这是完全可以预期的原因。谁发布它无关紧要。
    【解决方案3】:

    我会将调用封装在 isTRUE 中,这会产生所需的结果:

    > any(c(FALSE, NA))
    [1] NA
    > isTRUE(any(c(FALSE, NA)))
    [1] FALSE
    

    来自文档:

    ‘isTRUE(x)’是‘identical(TRUE, x)’的缩写,所以是 当且仅当‘x’是一个长度为一的逻辑向量,其唯一的 元素是“TRUE”并且没有属性(甚至没有名称)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      相关资源
      最近更新 更多