Как TRUE интерпретируется при использовании в качестве матричного индекса?

Я увидел какой-то (плохой) код где-то, который, как оказалось, вызывал функцию, которая выполняла mymatrix[TRUE] по пути. Оказывается, по крайней мере, в тестируемых образцах, что это интерпретируется как выбор всех элементов матрицы. Ясно, что [ не принуждает TRUE к 1, потому что тогда я бы получил только первый элемент, а не всю матрицу.  mymatrix[FALSE] возвращает numeric(0). Может ли кто-нибудь объяснить, что на самом деле делает [?

Ответ 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)] предоставит вам все остальные элементы.