R 向量的错误逻辑子集

R Wrong logical subsetting for a vector

我有两个逻辑向量。

a <- c(1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
b <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

当我像这样尝试将 b 子集化为 a 时

b[which(a == 1)]

一切都如我所料。然而,像这样

b[a]

我得到不同的结果。

为什么?可能解释很明显,但我完全不明白...

a 是一个二进制向量。可以使用 as.logical 将其转换为布尔值,然后它将按预期工作,即它将获得 'b' 中对应于 'a'

中的 TRUE 值的元素
b[as.logical(a)]

因为 0 被认为是 FALSE 而所有其他值都可以是 TRUE

as.logical(c(1, 0, 2, 3))
#[1]  TRUE FALSE  TRUE  TRUE

否则,索引从R开始,从1开始,1的值是根据位置选择第一个元素,其中如which(a == 1),从逻辑向量[=19]中获取序列的位置=]


b[c(1, 1, 0, 1)]

选择'b'的第一个元素三次

b[which(c(1, 1, 0, 1) == 1)]

获取位置为1,2,4选择'b'

which(c(1, 1, 0, 1) == 1)
#[1] 1 2 4

正如@akrun 所解释的,您需要基于 a.

b 进行子集化的逻辑值

下面是另一种将数字 a 转换为逻辑值的选项,例如

> b[!!a]
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
[39] 1 0 0 0