当用作矩阵索引时,如何解释TRUE?

时间:2013-05-07 12:09:29

标签: r

我在某个地方看到了一些(坏)代码,结果调用了一个在整个过程中执行mymatrix[TRUE]的函数。事实证明,至少在我测试的样本中,这被解释为选择矩阵的所有元素。显然,[并未强制TRUE强制转换1,因为那时我只返回返回的第一个元素,而不是整个矩阵。  mymatrix[FALSE]返回numeric(0)。 有人可以解释一下[实际上在做什么吗?

2 个答案:

答案 0 :(得分:7)

Logical索引告诉R要包含或排除哪些元素。

您有三种选择:

TRUE, FALSE, NA

它们用于表明是否应包括该位置所代表的指数。 换句话说:

  TRUE  == "Include the elment at this index"
  FALSE == "Do not include the element at this index"
  NA    == "Return NA instead of this index"  _(losely speaking)_

例如:

x <- 1:6
x[ c(TRUE, FALSE, TRUE, NA, TRUE, FALSE)]
#  [1]  1  3 NA  5

但是,适用标准回收规则。所以在上一个例子中,如果我们删除最后一个FALSE, 索引向量被重新定义,索引的第一个元素是TRUE,因此现在包含6的{​​{1}}元素

x

多维x <- 1:6 x[ c(TRUE, FALSE, TRUE, NA, TRUE )] # [1] 1 3 NA 5 6

上述内容适用于任何可以使用x进行子对象的对象,而不仅仅是向量。

如果[是多维的,我们可以在一个或所有维度上使用逻辑不一致,或者甚至将逻辑矩阵用作矩阵索引。

x

多维对象的单维索引。

问题在于,matricies不仅可以通过其维度进行索引,还可以通过其特定元素进行索引:

x <- matrix(1:12, nrow=3, ncol=4)

# using logical vectors on both dims
#   returns intersection of 2nd row and 3rd column
x[c(TRUE, FALSE, FALSE),  c(FALSE, FALSE, TRUE, FALSE)]
# [1] 7

# Same value
x[c(TRUE, FALSE, FALSE),  3]
# [1] 7

# return a checkerboard pattern, using a logical matrix as an index
x[ matrix(c(TRUE, FALSE), nrow=3, ncol=4) ]

将这一事实与x[7] # [1] 7 的回收规则结合起来,我们得到OP中引用的结果 也就是说,R相当于x[TRUE],即x[ rep(TRUE, length(x)) ] 相当于return every element of x

x[TRUE]
# [1]  1  2  3  4  5  6  7  8  9 10 11 12

x[TRUE, ,drop=FALSE]
#        [,1] [,2] [,3] [,4]
# [1,]    1    4    7   10
# [2,]    2    5    8   11
# [3,]    3    6    9   12

答案 1 :(得分:6)

当用作索引时,回收逻辑向量以匹配向量的长度。例如,mymatrix[c(TRUE, FALSE)]会为您提供其他所有元素。