R - 使用NA值对data.frame进行子集化时的'=='行为

时间:2018-01-18 16:17:25

标签: r dataframe na

我有一个看似简单的问题,我想弄清楚。

考虑这个例子:

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转换为字符,但这解决了问题。

1 个答案:

答案 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