R: выбор значений из матрицы по индексируемой матрице
У меня есть матрица данных с 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 ответа
Ваш цикл просто немного отключен:
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
не соответствует матрице, которую вы разместили ниже. Код должен работать так, как вы этого хотите.
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
измерение.