我正在比较两个数据集中的值。我经常想知道值是否相等。有时两个值都是NA
。
您可能知道NA == NA
返回了NA
。
我希望它返回TRUE
。
您可能知道NA == 10
返回了NA
。
我希望它返回FALSE
。
我考虑过的几个选择:
is.na
,然后检查第二个值is.na
mutate_all
中的NA
值都为空字符。还有其他我想念的聪明方法吗?
答案 0 :(得分:1)
您正在寻找的是%in%
NA %in% NA #TRUE
NA %in% 10 #FALSE
答案 1 :(得分:1)
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)
返回TRUE
(但是all.equal(NA,1)
不返回FALSE
!)
话虽如此
如果您希望NA == NA
成为TRUE
,则意味着您相信NA
本身就是一个有意义的值。如果您确实相信这一点,则将NA设置为显式值是完全可以接受的(并且可能更好),即使它是空字符串0
,"other"
或"unknown"
。 / p>
NA == NA
是NA
,因为当您不知道lhs上的内容和rhs上的内容时,您不知道它们是否相等。如果您知道,则表示它们不是NAs
。
间接相关:对于所有非?isTRUE
的内容,请参见FALSE
,TRUE
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。