identical(NA, NA)
返回TRUE
,但是以下代码过滤了日期框架中的NA
:
library(tidyverse)
filter(starwars, birth_year == birth_year)
如果NA
等于NA
,则上述 starwars 过滤的数据框应包括NA
的出生年月。为什么不呢?
答案 0 :(得分:5)
NA为NA的identical
,但不相等。如果运行NA==NA
,则响应将为NA,因为equal运算符不适用于NA。从identical
文档中:
对same的调用是在if和while中测试完全相等的方法 语句以及使用&&或||的逻辑表达式。在 所有这些应用程序都需要确保得到一个 逻辑值。
用户经常在其中使用比较运算符,例如==或!= 情况。看起来很自然,但这不是这些运算符 设计为在R中执行。它们返回的对象类似于参数。如果你 预期x和y的长度为1,但是碰巧其中之一 否则,您将不会获得单个FALSE。同样,如果 参数是NA,结果也是NA。无论哪种情况,表达式 if(x == y)....将无法正常工作。
还有==
的文档中的信息:
缺失值(NA)和NaN值被认为是不可比的 对他们自己,因此涉及它们的比较将始终导致NA。 比较字符串和 一个在当前的整理语言环境中无效。
基本原理是,在概念层面上缺失的值彼此不同。它们可能表示不同的值,但我们只是不知道这些值是什么。
在这种情况下,可以选择添加| is.na(birth_year)
。