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

Comparnig NAs in two different data sets

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

你可能知道 NA == NA returns NA.
我希望它返回 TRUE

你可能知道 NA == 10 returns NA.
我希望它返回 FALSE

我考虑过的几个选项:

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

有没有我遗漏的其他聪明的方法来处理这个问题?

您要找的是%in%

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

identical 函数 return 仅 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 returns logical(0)

是关于支持 NA 相等性的运算符 %==%

另见 ?all.equalall.equal(NA,NA) returns TRUE(但 all.equal(NA,1) 没有 return FALSE ! )

话虽这么说

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

NA == NANA 因为当您不知道 lhs 和 rhs 上的内容时,您不知道它们是否相等。如果你知道,那就意味着他们不是 NAs.

间接相关:请参阅 ?isTRUE,对于不是 TRUE

的所有内容,都将是 FALSE
isTRUE(c(TRUE,TRUE)) # FALSE (not a length 1 `TRUE` logical)

编辑回复评论:

我将 NA 理解为 "not available"(即缺失),而不是 "not applicable" 这是一个类别。 ?NA同意:

‘Not Available’ / Missing Values

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

但是,如果我正在匹配一个房子,例如,我可以将数字设置为 0 作为 "not applicable" 的约定,用于我的两个数据集中的所有房子,然后我可以安全地加入或安全地删除真实 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 列中创建 NA),然后删除带有 apartment_number == NAs 的行,但当然保留 我想保留房子,所以我应该越早将这些 NAs 设置为 0 更清洁。