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

R - Behaviour of '==' when subsetting data.frame with NA values

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

考虑这个例子:

df <- data.frame(ID=c("A", "B", NA, "C"), Value=c(1,2,3,4))
df$ID[df$ID %in% "A"]

Returns A(符合预期)

但是:

df$ID[df$ID == "A"]

Returns A <NA>.

我知道我可以使用 df$ID[df$ID == "A" & !is.na(df$ID)] 删除 NA 值,但是有人可以解释一下为什么 NA 值包含在输出中吗?它与数据类型有关吗?我尝试将列 ID 转换为字符,但这解决了问题。

因为df$ID == "A" return是一个逻辑向量。将这样的逻辑语句与 NA 值(df$ID 列中的第三个值)进行比较时,它不会 return false,因为它是 NA。 is.na() 用于与 NA 相关的逻辑向量。所以如果我们只做 df$ID == "A" 我们得到:

df$ID == "A"
[1]  TRUE FALSE    NA FALSE

所以现在如果你想通过这个逻辑向量对列 df$ID 进行子集化,你就是在对所有正确的事情进行子集化。但如果有的话,它也会还给你 NAs。 (当你使用 sum 函数时,它会 return 求和数字,如果你有 NAs ,这会提示使用 na.rm = TRUE 将它们从 sum 函数中删除。

这就是为什么 df$ID[df$ID == "A"] return 同时 A<NA>

df$ID[df$ID == "A"]
[1] A    <NA>
Levels: A B C