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
我有两个逻辑向量。
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'
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