Подмножество массива для пар индексов в r - PullRequest
0 голосов
/ 05 июля 2018

Хотя я искал, я не мог найти простой ответ на мой вопрос. Предположим, у меня есть массив:

    vector1 <- c(5,9,3)
vector2 <- c(10,11,12,13,14,15)
result <- array(c(vector1,vector2),dim = c(3,3,2))

Теперь я хочу разместить этот массив таким образом, чтобы получить элементы из определенных строк и столбцов. Например:

result[1,3,1:2]
result[3,1,1:2]

, так как у меня много индексов, они разбиты на

rowind=c(1,3)
colind=c(3,1)

Для поднабора я попытался использовать векторы строк и столбцов таким образом

dim(result[rowind,colind,1:2])

[1] 2 2 2

Это не то, что я хочу. Я хочу, чтобы мой вывод был одним значением для каждой пары индексов. Фактически, я хочу, чтобы моя извлеченная матрица имела размерность 2x2 (а не 2x2x2). Чтобы вы знали, что я пробовал «цикл». Но проблема в том, что у меня много массивов, и это будет очень много времени.

result_c=matrix(NA,nrow=2,ncol=2)

for (i in 1:2){
  result_c[i,]=result[rowind[i],colind[i],] 
}

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Мы могли бы передать matrix индексов для подмножества данных

result[cbind(rep(rowind, each = 2), rep(colind, each = 2), 1:2)]
#[1] 13 13  3  3
0 голосов
/ 05 июля 2018

Если я вас правильно понял, мы можем использовать Map

Map(function(i, j) result[i, j, 1:2], rowind, colind)
#[[1]]
#[1] 13 13
#
#[[2]]
#[1] 3 3

или упрощенно как matrix с использованием mapply

mapply(function(i, j) result[i, j, 1:2], rowind, colind)
#     [,1] [,2]
#[1,]   13    3
#[2,]   13    3

Map - это обертка для mapply, которая не упрощает результаты, тем самым производя list (а не matrix).

...