代码之家  ›  专栏  ›  技术社区  ›  colorlace

比较两个不同数据集中的NAS

na r
  •  0
  • colorlace  · 技术社区  · 6 年前

    我正在比较两个数据集的值。我经常想知道这些值是否相等。有时两个值都是 NA .

    如你所知 NA == NA 退货 .
    我希望它能回来 TRUE .

    如你所知 NA == 10 退货 .
    我希望它能回来 FALSE .

    我考虑了几个选项:

    1. 检查第一个值 is.na 然后检查第二个值 伊斯那
    2. mutate_all 这个 两个数据集中的值均为空字符。

    有没有其他聪明的方法来处理我错过的事情?

    2 回复  |  直到 6 年前
        1
  •  1
  •   moodymudskipper    6 年前

    这个 identical 函数只返回 TRUE FALSE ,无类型强制,无矢量化:

    identical(NA,NA)     # TRUE
    identical(1,1)       # TRUE    
    identical(1:2,1:2)   # TRUE   
    identical(c(a=1,b=2),1:2) # FALSE
    identical(1,1L)      # FALSE
    identical(NA_integer_,NA_character_) # FALSE
    identical(NULL,NULL) # TRUE
    identical(NULL,NA)   # FALSE
    

    %in% 可以用作技巧,但例如 NULL %in% NA 退货 logical(0)

    This question 是关于接线员的 %==% 那将支持 NA 平等。

    另请参见 ?all.equal , all.equal(NA,NA) 退货 真的 (但是 all.equal(NA,1) 不回来了 错误的 !)

    有人这么说

    如果你想的话 NA == NA 成为 真的 ,这意味着你相信 本身就是一个有意义的价值。如果您确实相信这一点,那么将NAS设置为显式值是完全可以接受的(可能更好),即使它是空字符串, 0 , "other" "unknown" .

    na==na 因为当你不知道左舵和右舵是什么的时候,你就不知道它们是否相等。如果你知道,这意味着他们不是 NAs .

    间接相关:参见 ?isTRUE 那将是 错误的 对于所有不存在的事物 真的

    isTRUE(c(TRUE,TRUE)) # FALSE (not a length 1 `TRUE` logical)
    

    编辑以答复评论:

    我将NA理解为“不可用”(即缺失),而不是“不适用”,这是一个类别。 ?NA 同意:

    _不可用__/缺少值

    如果我在数据集A中有一个未知的公寓编号,我会在左连接到数据集B之前小心,因为公寓编号可能在B的一侧已知,然后将不匹配,或者它们将是另一个缺少编号的公寓,我会匹配不属于一起的东西。

    但是,如果我匹配一个房子,例如,我可以将数字设置为0作为“不适用”的约定,用于我两个数据集中的所有房子,然后我可以安全地加入,或安全地删除real NAS .

    如果丢失了 id 列?:

    A <- data.frame(
      id = 1:5,
      place = c("house1","building1","buiding1","buiding1","building2"),
      apartment_number = c(NA, 1, NA,3,1),
      has_dog = c(T, T, T, F,F))
    
    B <- data.frame(
      id=1:5,
      place = c("house1","building1","buiding1","buiding1","building2"),
      apartment_number = c(NA, 1,2, NA,1),
      has_cat = c(T, T, T, F, F))
    
    # A                                        # B
    #   id     place apartment_number has_dog  #   id     place apartment_number has_cat
    # 1  1    house1               NA    TRUE  # 1  1    house1               NA    TRUE
    # 2  2 building1                1    TRUE  # 2  2 building1                1    TRUE
    # 3  3  buiding1               NA    TRUE  # 3  3  buiding1                2    TRUE
    # 4  4  buiding1                3   FALSE  # 4  4  buiding1               NA   FALSE
    # 5  5 building2                1   FALSE  # 5  5 building2                1   FALSE
    

    天真的融合:

    merge(A[-1],B[-1])
    #       place apartment_number has_dog has_cat
    # 1  buiding1               NA    TRUE   FALSE  # TRUE/FALSE ???
    # 2 building1                1    TRUE    TRUE
    # 3 building2                1   FALSE   FALSE
    # 4    house1               NA    TRUE    TRUE
    

    在我的数据中,每个有猫的人也有狗,现在我弄乱了我的宠物预测模型!

    一种选择是进行完全联接以保留所有可用的公寓编号(并在has_dog和has_cat列中创建NAS),然后删除 apartment_number == NAs 但是当然要保留我想保留房子,所以我应该设置这些 NAS 越早清理。

        2
  •  1
  •   Andre Elrico    6 年前

    你要找的是 %in%

    NA %in% NA   #TRUE
    NA %in% 10   #FALSE