在 R语言定义中,简要描述了NA
个值,其中一部分是
...特别是,
FALSE & NA
为FALSE
,TRUE | NA
为TRUE
。NA
不等于 任何其他价值或自身;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
答案 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几乎知道你要做什么。现在,我们是否应该将NA
与NA
匹配?可以争论。
考虑到这一点,我认为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都代表相同的现实生活对象。