r语言 - 使用条件(不包括 NA)对向量进行子集化


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%返回NAFALSE,因此在这里很有用。

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

最新更新