R: выбор значений из матрицы по индексируемой матрице - PullRequest
0 голосов
/ 02 июля 2018

У меня есть матрица данных с n строками и m столбцами (в данном случае n = 192, m = 1142) и индексной матрицей nxp (192x114). Каждая строка матрицы индексов показывает номера столбцов элементов, которые я хотел бы выбрать из соответствующей строки матрицы данных. Таким образом, у меня есть ситуация примерно так (с примерами значений):

data<-matrix(1:30, nrow=3)
data
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    4    7   10   13   16   19   22   25    28
[2,]    2    5    8   11   14   17   20   23   26    29
[3,]    3    6    9   12   15   18   21   24   27    30


columnindices<-matrix(sample(1:10,size=9, replace=TRUE),nrow=3)
columnindices
      [,1] [,2] [,3]
[1,]    8    7    4
[2,]   10    8   10
[3,]    8   10    2

Я бы хотел выбрать значения из строк матрицы данных, используя матрицу in columnindices, чтобы полученная матрица выглядела следующим образом

      [,1] [,2] [,3]
[1,]   22   19   10
[2,]   29   23   29
[3,]   24   30   6

Я пытался использовать цикл for:

result<-0
for(i in 1:3) {
 result[i]<-data[i,][columnindices[,i]]
 print[i]
}

но это не показывает желаемый результат. Я думаю, что моя проблема должна быть довольно просто решена, но, к сожалению, несмотря на многочасовую работу и многократные поиски, я все еще не смог ее решить (я новичок). Буду очень признателен за помощь!

Ответы [ 2 ]

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

Способ с for циклом, описанный @LAP, легче понять и реализовать.

Если вы хотели бы иметь что-то универсальное, то есть вам не нужно настраивайте номер строки каждый раз, вы можете использовать функцию mapply:

result <- mapply(
  FUN = function(i, j) data[i,j],
  row(columnindices),
  columnindices)
dim(result) <- dim(columnindices)

mapply цикл через каждый элемент двух матриц,

  • строка (columnindices) предназначена для i индекс строки
  • columnindices для j индекса столбца.

Возвращает вектор, который вы должны привести к исходному измерению columnindices.

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

Ваш цикл чуть-чуть выключен:

result <- matrix(rep(NA, 9), nrow = 3)
for(i in 1:3){
  result[i,] <- data[i, columnindices[i,]]
}

> result
     [,1] [,2] [,3]
[1,]   25   13    7
[2,]   29   29   23
[3,]   15   15   18

Обратите внимание, что матрица не совсем та, которую вы опубликовали в качестве ожидаемого результата, потому что код для вашего примера columnindices не соответствует матрице, которую вы опубликовали ниже. Код должен работать так, как вы хотите.

...