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

时间:2018-07-19 14:55:04

标签: r na

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

您可能知道NA == NA返回了NA
我希望它返回TRUE

您可能知道NA == 10返回了NA
我希望它返回FALSE

我考虑过的几个选择:

  1. 检查第一个值is.na,然后检查第二个值is.na
  2. 两个数据集中的mutate_all中的NA值都为空字符。

还有其他我想念的聪明方法吗?

2 个答案:

答案 0 :(得分:1)

您正在寻找的是%in%

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

答案 1 :(得分:1)

identical函数仅返回TRUEFALSE,没有类型强制,没有向量化:

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.equalall.equal(NA,NA)返回TRUE(但是all.equal(NA,1)不返回FALSE!)

话虽如此

如果您希望NA == NA成为TRUE,则意味着您相信NA本身就是一个有意义的值。如果您确实相信这一点,则将NA设置为显式值是完全可以接受的(并且可能更好),即使它是空字符串0"other""unknown"。 / p>

NA == NANA,因为当您不知道lhs上的内容和rhs上的内容时,您不知道它们是否相等。如果您知道,则表示它们不是NAs

间接相关:对于所有非?isTRUE的内容,请参见FALSETRUE

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

编辑以回答评论:

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

  

“不可用” /缺少值

如果我在数据集AI中有未知的公寓编号,请在对数据集B进行左联接之前要格外小心,因为公寓编号可能会在B侧知道,然后将不匹配,否则它们将成为另一个公寓缺少一个数字,我将匹配不属于一起的事物。

但是,如果我要匹配房屋,则可以将数字设置为0,以作为两个数据集中所有房屋“不适用”的约定,然后我就可以安全加入或安全删除真实的{{ 1}}。

如果丢失了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

在我的数据中,每个有猫的人也有一只狗,现在我搞砸了我的宠物预测器模型!

一个选择是进行完全连接以保留所有可用的公寓号(并在has_dog和has_cat列中创建NA),然后使用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 删除行,但是当然要保留我要保留的房屋,所以我应该越早将这些apartment_number == NAs设置为0。