我有一个看似简单的问题,我想弄清楚。
考虑这个例子:
df <- data.frame(ID=c("A", "B", NA, "C"), Value=c(1,2,3,4))
df$ID[df$ID %in% "A"]
返回A
(按预期方式)
可是:
df$ID[df$ID == "A"]
返回A <NA>
。
我知道我可以使用df$ID[df$ID == "A" & !is.na(df$ID)]
删除NA值,但是有人可以解释为什么NA值根本包含在输出中吗?它与数据类型有关吗?我尝试将列ID转换为字符,但这解决了问题。
答案 0 :(得分:1)
因为df$ID == "A"
返回一个逻辑向量。将这样的逻辑语句与NA值(df $ ID列中的第三个值)进行比较时,它不会返回false,因为它的NA。 is.na()
是用于与NA
相关的逻辑向量的内容。因此,如果我们只做df$ID == "A"
,我们就会得到:
df$ID == "A"
[1] TRUE FALSE NA FALSE
所以现在如果你想通过这个逻辑向量对列df $ ID进行子集化,你就可以将所有真实的子集进行子集化。但如果有的话,它也会给你NA
。 (当您使用sum函数时,它将返回求和的数字,如果有的话,还会返回NA
,这会提示使用na.rm = TRUE
将它们从sum函数中删除。
这就是df$ID[df$ID == "A"]
同时返回A
和<NA>
df$ID[df$ID == "A"]
[1] A <NA>
Levels: A B C