我在某处看到了一些(坏)代码,结果证明它调用了一个mymatrix[TRUE]
沿途执行的函数。事实证明,至少在我测试的样本中,这被解释为选择矩阵的所有元素。显然[
不是强制TRUE
到1
,因为那样我只会得到返回的第一个元素,而不是整个矩阵。
mymatrix[FALSE]
返回numeric(0)
。有人可以解释[
这里实际上在做什么吗?
问问题
163 次
2 回答
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
第一个元素x
x <- 1:6
x[ c(TRUE, FALSE, TRUE, NA, TRUE )]
# [1] 1 3 NA 5 6
多维x
以上适用于可以使用 进行子集化的任何对象[
,而不仅仅是向量。
如果x
是多维的,我们可以在一个或所有维度上使用逻辑索引,甚至可以使用逻辑矩阵作为矩阵索引。
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
结合这个事实,加上R
's 的回收规则,我们得到了 OP 中引用的结果。
即 是 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
于 2013-05-07T13:11:22.197 回答
7
当用作索引时,逻辑向量被回收以匹配向量的长度。例如,mymatrix[c(TRUE, FALSE)]
会给你所有其他元素。
于 2013-05-07T12:38:01.153 回答