用 R 中的逻辑向量子集逻辑向量

Subsetting a logical vector with a logical vector in R

(注意:根据评论中的建议,我将原来的标题“Comparing the content of two vectors in R?”改为“Subsetting a logical vector with a logical vector in R”)

我正在尝试理解以下 R 代码片段(顺便说一下,这个问题是在我试图理解 this example 时产生的)

我有一个矢量 a 定义为:

a = c(FALSE, FALSE)

然后我可以定义b:

b <-  a

我检查了 b 的内容,一切正常:

b
#> [1] FALSE FALSE

问题

现在,下面的代码在做什么?它是否检查 b 是否等于“不”a

b[!a] 
#> [1] FALSE FALSE

但是如果我尝试 b[a] 结果会不同:

b[a] 
#> logical(0)

我也尝试了一个不同的例子:

a = c(FALSE, TRUE)
b <-  a
b
#> [1] FALSE  TRUE

现在我尝试与上面相同的操作,但我得到了不同的结果:

b[!a] 
#> [1] FALSE
b[a] 
#> [1] TRUE

reprex package (v0.3.0)

于 2021-03-23 创建

[] 用于对向量进行子集化。您可以使用整数索引或逻辑值对向量进行子集化。

当您使用逻辑向量对向量进行子集化时,如果向量中的值为 TRUE,则会选择该值。在您的示例中,您正在用一个逻辑向量子集化一个逻辑向量,这可能会造成混淆。再举个例子:

a <- c(10, 20)
b <- c(TRUE, FALSE)
a[b] 
#[1] 10

由于第一个值为 TRUE,第二个值为 FALSE,因此选择第一个值。

现在如果我们反转值,将选择 20,因为 !b returns FALSE TRUE.

a[!b]
#[1] 20

现在在您的示例中实现相同的逻辑 -

a = c(FALSE, FALSE)
b <- a

!b returns TRUE TRUE,因此当您执行 b[!a] 时会选择两个值,而当您执行时会选择值的 none b[a].

b[!a] 将导致显示那些 b 的值,这些值在 !a.

评估的 TRUE 位置

!a 实际上是 T,因此 T 显示 b 的第一个和第二个值,即 F 和 F

更高效请看这里

a <- 1:4
b <- c(T, T, F, T)

现在 a[!b] 将显示 a[c(F, F, T, F)]a

的第三个元素