在R中比较elementwise时如何将NAs视为值

hel*_*ter 2 arrays r na

我想比较两个向量元素,以检查第一个向量中某个位置的元素是否与第二个向量中相同位置的元素不同.
关键是我NA在向量中有值,当对这些值进行比较时,我得到的NA不是TRUEFALSE.

可重复的例子:

这是我得到的:

a<-c(1, NA, 2, 2, NA)
b<-c(1, 1, 1, NA, NA)
a!=b
[1] FALSE   TRUE   NA   NA   NA  
Run Code Online (Sandbox Code Playgroud)

以下是我希望!=操作符的工作方式(将NA值视为变量的另一个"级别"):

a!=b
[1] FALSE   TRUE   TRUE   TRUE   FALSE
Run Code Online (Sandbox Code Playgroud)

这个链接上有一个可能的解决方案,但是这个人正在创建一个执行任务的功能.我想知道是否有更优雅的方式来做到这一点.

TMS*_*TMS 6

我喜欢这个,因为它非常简单并且很容易看出它的工作原理(来源):

# This function returns TRUE wherever elements are the same, including NA's,
# and FALSE everywhere else.
compareNA <- function(v1, v2) 
{
    same <- (v1 == v2) | (is.na(v1) & is.na(v2))
    same[is.na(same)] <- FALSE
    return(same)
}
Run Code Online (Sandbox Code Playgroud)


CJB*_*CJB 5

利用以下事实:

T & NA = NAF & NA = F

F | NA = NAT | NA = T

以下解决方案有效,并仔细放置括号:

(a != b | (is.na(a) & !is.na(b)) | (is.na(b) & !is.na(a))) & !(is.na(a) & is.na(b))
Run Code Online (Sandbox Code Playgroud)

你可以定义:

`%!=na%` <- function(e1, e2) (e1 != e2 | (is.na(e1) & !is.na(e2)) | (is.na(e2) & !is.na(e1))) & !(is.na(e1) & is.na(e2))
Run Code Online (Sandbox Code Playgroud)

然后使用:

a %!=na% b
Run Code Online (Sandbox Code Playgroud)