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 进行子集化,你就是在对所有正确的事情进行子集化。但如果有的话,它也会还给你 NA
s。 (当你使用 sum 函数时,它会 return 求和数字,如果你有 NA
s ,这会提示使用 na.rm = TRUE
将它们从 sum 函数中删除。
这就是为什么 df$ID[df$ID == "A"]
return 同时 A
和 <NA>
df$ID[df$ID == "A"]
[1] A <NA>
Levels: A B C
我想弄清楚一个看似简单的问题。
考虑这个例子:
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 进行子集化,你就是在对所有正确的事情进行子集化。但如果有的话,它也会还给你 NA
s。 (当你使用 sum 函数时,它会 return 求和数字,如果你有 NA
s ,这会提示使用 na.rm = TRUE
将它们从 sum 函数中删除。
这就是为什么 df$ID[df$ID == "A"]
return 同时 A
和 <NA>
df$ID[df$ID == "A"]
[1] A <NA>
Levels: A B C