使用条件对向量进行子集化(排除NA值)

6
vector1 = c(1,2,3,NA)
condition1 = (vector1 == 2)
vector1[condition1]
vector1[condition1==TRUE]

在上面的代码中,条件1为“FALSE TRUE FALSE NA”,第三行和第四行都给出了结果“2 NA”,这不是我想要的。
我想要的是其值真正为'2'的元素,不包括NA。
有人可以解释一下为什么R被设计成这样工作吗?我该如何使用简单的命令得到我想要的结果?
4个回答

4

子集vector [NA]始终为NA,因为NA值未知,因此子集的结果也未知。%in%对于NA返回FALSE,因此在这里可以很有用。

vector1 = c(1,2,3,NA)
condition1 = (vector1 %in% 2)
vector1[condition1]
# [1] 2

2
如果您在RStudio中输入以下内容:
?`[`

您将获得以下说明:

索引中的NAs

在提取数据时,使用数字、逻辑或字符类型的NA索引会选择未知元素,并在逻辑型、整数型、数字型、复数型或字符型结果的相应元素中返回NA,在列表的情况下返回NULL。(对于原始数据结果,它返回00。)

在替换数据时(即在赋值语句的左侧使用索引),NA不会选择要替换的任何元素。由于存在某种模棱两可的情况,即是否应该使用rhs的一个元素进行替换,因此仅当rhs值的长度为1时才允许这样做(因此,这两种解释将产生相同的结果)。 (S的文档行为是NA替换索引“不起作用”,但消耗了一个具有值的元素:Becker等人第359页。但是,其他实现并非如此。)


0

在那种情况下尝试逻辑运算符,

vector1 = c(1,2,3,NA)
condition1<-(vector1==2 & !is.na(vector1) )
condition1
# FALSE TRUE FALSE FALSE
vector1[condition1]
# 2

& 操作符在逻辑运算中,只有当两个操作数都为 True 时才返回 True。


请参阅 ?NA 了解详细信息。 - BJK

0

identical是“测试两个对象是否完全相等的安全可靠方法。在这种情况下,它返回TRUE,在其他情况下返回FALSE。”(参见?identical)

由于它不进行逐个元素比较,因此您可以在sapply中使用它来比较vector1中的每个元素与2。例如:

condition1 = sapply(vector1, identical, y = 2)

这将会给出:

vector1[condition1]
[1] 2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接