Я увидел какой-то (плохой) код где-то, который, как оказалось, вызывал функцию, которая выполняла mymatrix[TRUE]
по пути. Оказывается, по крайней мере, в тестируемых образцах, что это интерпретируется как выбор всех элементов матрицы. Ясно, что [
не принуждает TRUE
к 1
, потому что тогда я бы получил только первый элемент, а не всю матрицу.
mymatrix[FALSE]
возвращает numeric(0)
.
Может ли кто-нибудь объяснить, что на самом деле делает [
?
Как TRUE интерпретируется при использовании в качестве матричного индекса?
Ответ 1
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
является многомерным, мы можем использовать логические indecies для одного orr всех измерений или даже логической матрицы в качестве матричного индекса.
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
, мы получаем результат, на который ссылается 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
Ответ 2
При использовании в качестве индексов логические векторы перерабатываются в соответствии с длиной вектора. Например, mymatrix[c(TRUE, FALSE)]
предоставит вам все остальные элементы.