代码之家  ›  专栏  ›  技术社区  ›  stackinator Brenton Wiernik

在R中,na==na?

na r
  •  0
  • stackinator Brenton Wiernik  · 技术社区  · 6 年前

    identical(NA, NA) 收益率 TRUE ,但以下代码过滤器 NA 过期框架:

    library(tidyverse)
    filter(starwars, birth_year == birth_year)
    

    如果 平等 这个 星际大战 以上过滤数据框应包括出生年份 . 为什么不呢?

    1 回复  |  直到 6 年前
        1
  •  5
  •   iod    6 年前

    钠是 identical 但不等于。如果你跑 NA==NA ,响应将为na,因为equal运算符不适用于nas。从 完全相同的 文档:

    调用相同是检验if和while中完全相等的方法 语句,以及使用&&或的逻辑表达式中的语句。在 所有这些应用程序都需要确保 逻辑值。

    用户经常使用比较运算符,例如==或!=,在这些 情况。看起来很自然,但这不是这些操作人员的本性 设计用于在R中执行。它们返回类似于参数的对象。如果你 期望x和y的长度为1,但碰巧其中一个 不是,你不会得到一个单一的错误。同样,如果 参数是na,结果也是na。在这两种情况下,表达式 如果(x==y)…无法按预期工作。

    从文件中 == :

    缺失值(na)和Nan值被认为是不可比的,甚至 对他们自己而言,因此涉及到他们的比较总是会导致NA。 在比较字符串和 一个在当前排序规则区域设置中无效。

    其基本原理是,在概念层面上,缺失的值彼此不相同。它们可能代表非常不同的值,但我们不知道这些值是什么。

    在这种情况下,另一种选择是增加 | is.na(birth_year) .