vector1 = c(1,2,3,NA)
condition1 = (vector1 == 2)
vector1[condition1]
vector1[condition1==TRUE]
在上面的代码中,条件 1 是 "FALSE TRUE FALSE NA",第 3 行和第 4 行都给了我结果"2 NA"这不是我所期望的。
我想要值真正为"2"的元素,不包括 NA。
谁能解释为什么R被设计成以这种方式工作?以及如何通过简单的命令获得我想要的结果?
集vector[NA]
将始终NA
,因为NA
值未知,因此子集的结果也是未知的。 %in%
返回NA
的FALSE
,因此在这里很有用。
vector1 = c(1,2,3,NA)
condition1 = (vector1 %in% 2)
vector1[condition1]
# [1] 2
如果您在 RStudio 中并输入
?`[`
您将获得以下解释:
索引中的 NA
提取时,数字、逻辑或字符 NA 索引会选择一个 未知元素,因此在 a 的相应元素中返回 NA 逻辑、整数、数字、复数或字符结果,以及 的 NULL。 列表。(它返回 00 作为原始结果。
替换时(即对分配的 lhs 使用索引(NA 不选择要替换的任何元素。由于存在歧义 是否应该使用 RHS 的元素,这只是 如果 rhs 值的长度为 1,则允许(因此两种解释 会有相同的结果(。(记录在案的S的行为是 NA 替换索引"无处可去",但占用了 值:贝克尔等人,第359页。然而,其他情况并非如此。 实现。
在这种情况下尝试逻辑运算符,
vector1 = c(1,2,3,NA)
condition1<-(vector1==2 & !is.na(vector1) )
condition1
# FALSE TRUE FALSE FALSE
vector1[condition1]
# 2
当两个逻辑运算符都为 True 时,操作返回 true。
identical
是"测试两个物体是否完全相同的安全可靠的方法。在这种情况下,它返回 TRUE,在其他所有情况下返回 FALSE。(见 ?相同(
由于它不比较逐个元素比较,因此您可以在 sapply 中使用它来比较 vector1 和 2 中的每个元素。 即:
condition1 = sapply(vector1, identical, y = 2)
这将提供:
vector1[condition1]
[1] 2