Индексируйте матрицу, используя два вектора одинаковой длины для индексов строк и столбцов - PullRequest
3 голосов
/ 27 марта 2020

Представьте, что у вас есть матрица 5x5 и вы хотите выбрать значения, используя два вектора одинаковой длины, один из которых представляет строку индекса, а другой представляет столбец индекса:

m <- matrix(1:25, ncol = 5)
R <- c(1, 3, 5)
C <- c(2, 4, 4)

Требуемый результат здесь - один вектор из 6 (строка 1, столбец 2), 18 (строка 3, столбец 4), 20 (строка 5, столбец 4).

Лучшее, что я мог придумать, было :

diag(m[R,C])

Но это создает матрицу размером length(R) * length(C) и поэтому медленно, если R и C длинные.

Как вы это делаете?

Ответы [ 3 ]

4 голосов
/ 27 марта 2020

Вы можете использовать cbind(R, C) для индексации с [:

m[cbind(R,C)]

#> [1]  6 18 20
2 голосов
/ 27 марта 2020

с использованием mapply

mapply(function(r,c) {m[r,c]}, r = R, c = C)
# [1]  6 18 20

создание матрицы для индексов.

m[matrix(c(R,C), ncol=2)]
# [1]  6 18 20
1 голос
/ 27 марта 2020

Другой вариант -

M[do.call(cbind, list(R, C))]
...