NA匹配NA,但不等于NA。为什么?

时间:2014-08-03 02:06:56

标签: r

R语言定义中,简要描述了NA个值,其中一部分是

  

...特别是,FALSE & NAFALSETRUE | NATRUENA不等于   任何其他价值或自身; NA的测试是使用is.na完成的。但是,NA值将与NA中的另一个match值匹配。

关于声明" NA 不等于 任何其他价值或自身",


更新: 再次修订的问题是

NA 匹配 NA match背后的原因是什么? ,以及该语言中没有其他地方?

对我来说,任何人都不知道(或者不会丢失)的缺失值与另一个相同类型的缺失值相匹配并不合理。自从我发布这个以来,我在example(match)中遇到了一些提供一些推理的内容。字符强制改变了它的类型。如果我愿意的话,我可以完全删除它。

match(NA, NA)
# [1] 1
match(NA, NA_real_)
# [1] 1
match(NA_character_, NA_real_)
# [1] 1
match(paste(NA), NA)
# [1] NA
gsub("NA", "", NA)
# [1] NA
gsub("NA", "", paste(NA))
# [1] ""
is.na(NA)
# [1] TRUE
is.na(paste(NA))
# [1] FALSE

为搅拌锅而道歉,但有些文件对此并不清楚。它可能归结为R解析器/ deparser以及您可以将任何内容转换为R中的文本字符对象。


原帖:

现在提及"但是, NA 值将匹配中的另一个 NA match"

如果NA不等于它自己,为什么它在match中与自身匹配?还在identical?这是故意的吗?

NA == NA  ## expecting TRUE
# [1] NA
NA != NA
# [1] NA
x <- NA
x == x
# [1] NA
match(NA, NA)
# [1] 1
identical(NA, NA)
# [1] TRUE
all.equal(NA, NA)
# [1] TRUE

2 个答案:

答案 0 :(得分:15)

这是一个惯例问题。 ==的工作方式有充分的理由。 NA是R中的一个特殊值,它应该表示缺少的数据,应该与其他数据区别对待。如果我们开始比较缺失值,就好像它们已知或者两个缺失值彼此相等,就会出现无数非常微妙的错误。

NA视为含义&#34;我不知道那里有什么&#34;。 3 > NA的正确答案显然是NA,因为我们不知道缺失值是否大于3。嗯,NA == NA也一样。它们都是缺失的值,但真正的价值可能会大不相同,所以正确的答案是&#34;我不知道。&#34;

R不知道你在分析中做了什么,所以它不会引入以后最终会被发布并让你感到尴尬的错误,它不允许比较运算符认为NA是一个值

编写

match()时考虑了更具体的目的:找到匹配值的索引。如果你问问题&#34;我是否应该将NA与#34匹配,合理的答案是&#34;否。&#34;不同(并且非常有用)的约定,并且证明是合理的,因为当你调用match()时,R几乎知道你要做什么。现在,我们是否应该将NANA匹配?可以争论。

考虑到这一点,我认为match()的作者默认选择允许NA与自身匹配有点奇怪。您可以想象可以使用match()NA中查找table行以及其他值的情况,但这很危险。您只需要更加小心,知道您是否在x中有任何NA值,并且只有在您真正想要的情况下才允许它们。您可以在调用incomparables=NA时指定match()来更改此行为。

答案 1 :(得分:4)

添加@ farnsy的好答案,并详细说明与==match的区别:

要考虑的关键是如何使用这两个函数(==match)。

x == y
translation:  Is the value on the left the same value as the one on the right

match(x, table)
translation:  Is the value on the left found in the table on the right; 
              if so, return the index of the FIRST TIME that x appears in table

我经常遇到的一个常见用例是使用一组ID。特别是,当处理已加入的两个不同数据集时,我可能会在我的一个ID列中留下几个NA

然而,并非所有的NA都代表相同的现实生活对象。