R:通过索引矩阵从矩阵中选取值

R: Picking values from matrix by indice matrix

我有一个 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]
}

但这并没有显示出想要的结果。我想我的问题应该很简单地解决,但不幸的是,无论工作多少小时和多次搜索我仍然无法解决它(我是菜鸟)。非常感谢您的帮助!

你的循环有点偏离:

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 的代码与您在下面发布的矩阵不匹配。代码应该如您所愿地工作。

@LAP描述的for循环方式更容易理解和实现。

如果你想要一些通用的东西,也就是说你不需要 每次调整行号,可以利用mapply函数:

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

mapply循环遍历两个矩阵的每个元素,

  • row(columnindices) 用于 i 行索引
  • columnindices 用于 j 列索引。

它 returns 一个向量,您必须将其强制转换为初始 columnindices 维度。