【问题标题】:How to treat NAs like values when comparing elementwise in R在 R 中逐元素比较时如何将 NA 视为值
【发布时间】:2016-06-03 08:55:13
【问题描述】:

我想逐元素比较两个向量,以检查第一个向量中某个位置的元素是否与第二个向量中相同位置的元素不同。
关键是我在向量中有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  

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

a!=b
[1] FALSE   TRUE   TRUE   TRUE   FALSE

this link 有一个可能的解决方案,但这个人正在创建一个函数来执行任务。我想知道是否有更优雅的方式来做到这一点。

【问题讨论】:

  • 如何获得第二种情况的 TRUE 值。它应该是 FALSE,因为我们正在将 NA 与 1 进行比较
  • 你能用一个虚拟值代替NA吗?例如a[is.na(a)] &lt;- 999.
  • @akrun 我得到TRUE 因为NA 与1 不同(不等于)。@Bazz 是的,我想到了那个解决方案,它也有效,但我想要更多优雅的解决方案,而不必进行估算,因为我应该在比较之后重新转换 NA 的值(我有一个非常大的数据集,所以它不是很实用)
  • 您是否正在寻找新的示例来更新帖子?
  • 你能更新你的输出/更清楚地解释你试图实现的目标吗?

标签: arrays r na


【解决方案1】:

利用以下事实:

T &amp; NA = NAF &amp; 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))

你可以定义:

`%!=na%` <- function(e1, e2) (e1 != e2 | (is.na(e1) & !is.na(e2)) | (is.na(e2) & !is.na(e1))) & !(is.na(e1) & is.na(e2))

然后使用:

a %!=na% b

【讨论】:

  • 这行得通,但是当您在描述中的链接中执行该功能的变体时,我会留下问题。我发布问题是为了找到一个更简单的解决方案(如果存在)。
  • @hellter 没关系。你是对的,对于一些非常简单的事情来说,这似乎是一个不雅的解决方案。
【解决方案2】:

我喜欢这个,因为它非常简单,而且很容易看出它有效 (source):

# 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)
}

【讨论】:

    【解决方案3】:

    这是另一种解决方案。它可能比我的其他答案慢,因为它没有矢量化,但它肯定更优雅。前几天我注意到%in%NA 与其他值进行比较。例如,c(1L, NA) %in% 1:4 给出的是TRUE FALSE 而不是TRUE NA

    所以你可以拥有:

    !mapply(`%in%`, a, b)
    

    【讨论】:

      【解决方案4】:

      我们可以使用两个向量中都不存在的值 v1 即时替换 NA 值并执行 !=

      f1 <- function(x, y) {
        v1 <- setdiff(1:1000, na.omit(unique(c(x,y))))[1]
        replace(x, is.na(x), v1) != replace(y, is.na(y), v1)
      }
      
      f1(a,b)
      #[1] FALSE  TRUE  TRUE  TRUE FALSE
      f1(a1,b1)
      #[1] TRUE TRUE TRUE
      f1(a2,b2)
      #[1] FALSE  TRUE  TRUE FALSE
      

      数据

      a <- c(1, NA, 2, 2, NA)
      b<-c(1, 1, 1, NA, NA)
      a1 <- c(NA, 1, NA)
      b1 <- c(2, NA, 3) 
      a2<-c(1,NA,2,NA)
      b2<-c(1,1,3,NA)
      

      【讨论】:

      • 我忘记添加比较两个NA 值的情况:在这种情况下,我希望比较返回FALSE。此外,如果我在第一个向量中的 NA 和第二个向量中都有 NA,我希望有一个解决方案。我编辑了问题。
      • 这会在第二个位置返回FALSE,而它应该是TRUE
      • @Bazz 为什么它应该是 TRUE??
      • 因为a[2]NAb[2]1,所以它们是不同的。
      • @Bazz 这就是我的观点。它们是不同的,所以它应该返回 FALSE
      猜你喜欢
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-08
      相关资源
      最近更新 更多