比较两个不同数据集中的 NA
Comparnig NAs in two different data sets
我正在比较两个数据集的值。通常我想知道这些值是否相等。有时两个值都是 NA
.
你可能知道 NA == NA
returns NA
.
我希望它返回 TRUE
。
你可能知道 NA == 10
returns NA
.
我希望它返回 FALSE
。
我考虑过的几个选项:
- 检查第一个值是否
is.na
然后检查第二个值是否 is.na
mutate_all
两个数据集中的 NA
值都为空字符。
有没有我遗漏的其他聪明的方法来处理这个问题?
您要找的是%in%
NA %in% NA #TRUE
NA %in% 10 #FALSE
identical
函数 return 仅 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
returns logical(0)
是关于支持 NA
相等性的运算符 %==%
。
另见 ?all.equal
、all.equal(NA,NA)
returns TRUE
(但 all.equal(NA,1)
没有 return FALSE
! )
话虽这么说
如果您希望 NA == NA
成为 TRUE
,则表示您认为 NA
本身就是一个有意义的值。如果您确实相信这一点,那么将您的 NA 设置为一个显式值是完全可以接受的(并且可能更好),即使它是空字符串,0
、"other"
或 "unknown"
。
NA == NA
是 NA
因为当您不知道 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 更清洁。
我正在比较两个数据集的值。通常我想知道这些值是否相等。有时两个值都是 NA
.
你可能知道 NA == NA
returns NA
.
我希望它返回 TRUE
。
你可能知道 NA == 10
returns NA
.
我希望它返回 FALSE
。
我考虑过的几个选项:
- 检查第一个值是否
is.na
然后检查第二个值是否is.na
mutate_all
两个数据集中的NA
值都为空字符。
有没有我遗漏的其他聪明的方法来处理这个问题?
您要找的是%in%
NA %in% NA #TRUE
NA %in% 10 #FALSE
identical
函数 return 仅 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
returns logical(0)
NA
相等性的运算符 %==%
。
另见 ?all.equal
、all.equal(NA,NA)
returns TRUE
(但 all.equal(NA,1)
没有 return FALSE
! )
话虽这么说
如果您希望 NA == NA
成为 TRUE
,则表示您认为 NA
本身就是一个有意义的值。如果您确实相信这一点,那么将您的 NA 设置为一个显式值是完全可以接受的(并且可能更好),即使它是空字符串,0
、"other"
或 "unknown"
。
NA == NA
是 NA
因为当您不知道 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 更清洁。