【问题标题】:R Equality while ignoring NAs忽略 NA 的 R 平等
【发布时间】:2013-01-23 19:27:40
【问题描述】:

如果x 不是NA,是否存在== 的等价物,但结果是x != NA

以下是我想要的,但它很笨重:

mapply(identical, vec1, vec2)

【问题讨论】:

    标签: r


    【解决方案1】:

    只需将“==”替换为 %in%。

    例子:

    > df <- data.frame(col1= c("a", "b", NA), col2= 1:3)
    > df
           col1 col2
        1    a    1
        2    b    2
        3 <NA>    3
    
    > df[df$col1=="a", ]
           col1 col2
        1     a    1
        NA <NA>   NA
    
    > df[df$col1%in%"a", ]
           col1 col2
        1    a    1
    
    > "x"==NA
      [1] NA
    
    > "x"%in%NA
      [1] FALSE
    

    【讨论】:

    • 这不适用于向量相等,即您仍然需要使用mapply 来识别vec1 的每个元素是否等于vec2 的相应元素。
    【解决方案2】:

    1 == NA 返回一个逻辑 NA 而不是 TRUEFALSE。如果你想调用NAFALSE,你可以添加第二个条件:

    set.seed(1)
    x <- 1:10
    x[4] <- NA
    y <- sample(1:10, 10)
    
    x <= y
    # [1]  TRUE  TRUE  TRUE    NA FALSE  TRUE  TRUE FALSE  TRUE FALSE
    
    x <= y & !is.na(x)
    # [1]  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE
    

    您还可以使用第二个处理步骤将所有 NA 值从相等测试转换为 FALSE

    foo <- x <= y
    foo[is.na(foo)] <- FALSE
    foo
    # [1]  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE
    

    此外,NA == NANA != NA 一样返回 NA

    【讨论】:

    • 不得不做 AND 有点烦人,但我想如果没有更好的方法。
    • 怎么样?你会建议什么? NA 以一种特殊的方式表现(NULL 也是如此)出于非常重要的原因!
    • 我意识到== 的行为很有价值,但我希望有一个操作员==' 也能按照我的意愿行事。 (R 不允许用户定义的运算符,对吧?)
    • @Xodarap 你当然可以:'%==%' &lt;- function(a, b) a&lt;=b &amp; !is.na(a); x %==% y。您还可以定义自己的类并在其上创建方法,以便您的类的 == 可以按照您的意愿行事 see here
    • 我知道这是 5 岁,但为什么 NA &amp; FALSE 会评估为 FALSE 而不是 NA?这似乎是完全不一致的行为。
    【解决方案3】:

    == 运算符通常与过滤 data.frames 结合使用。

    在这种情况下,dplyr::filter 将仅保留条件计算结果为 TRUE 的行,这与 [ 不同。这有效地实现了==,但其中1 == NA 评估为FALSE

    例子:

    > df <- data.frame(col1= c("a", "b", NA), col2= 1:3)
    > df
           col1 col2
        1    a    1
        2    b    2
        3 <NA>    3
    
    > dplyr::filter(df, col1=="a")
           col1 col2
        1     a    1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      相关资源
      最近更新 更多