R:使用索引矩阵从数组中提取矩阵

时间:2016-09-06 08:43:54

标签: arrays r matrix

我在R中编码,我有一个包含数据的三维数组(示例中为ab)。然后我有一个矩阵,其中包含第三个数组维度(idx)的索引。该矩阵具有与该数组相同的行数和列数。我想使用idx中包含的索引从数组中提取数据,以获得具有相同idx维度的矩阵。请参阅以下示例:

a <- c(1:9)
b <- rev(a)

#array of data
ab <- array(c(a,b), dim = c(3,3,2))
ab
, , 1

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

, , 2

     [,1] [,2] [,3]
[1,]    9    6    3
[2,]    8    5    2
[3,]    7    4    1

#matrix of indices
idx <- matrix(sample(1:2,9,replace=TRUE), nrow = 3)
idx
     [,1] [,2] [,3]
[1,]    2    2    2
[2,]    2    1    1
[3,]    1    1    1

#now I want to get the following matrix:
     [,1] [,2] [,3]
[1,]    9    6    3
[2,]    8    5    8
[3,]    3    6    9

#these two don´t do the job
ab[idx]
ab[ , ,idx]

有人知道我怎么能得到它?

非常感谢!

萨拉

2 个答案:

答案 0 :(得分:3)

我们需要行/列的索引和第三维(来自&#39; idx&#39;)来提取元素。我们通过{{1}使用&#39; idx&#39;的行索引,列索引来执行此操作。

free chocolate & cake

答案 1 :(得分:1)

可能有点复杂,但至少可以起作用: 首先是我的idx:

        [,1] [,2] [,3]
[1,]    2    2    1
[2,]    1    2    1
[3,]    2    2    2

首先我把它变成了一个矢量:

idVec <- as.vector(idx)
d3mat <- apply(ab,3,as.vector)

然后我构造了一个向量,遍历每个元素:

len <- length(idVec)
len <- 1:len

然后我将一个函数应用于向量len的每个元素:

resultvec <- sapply(len, function(x, vec, mat){return(mat[x,vec[x]])}, mat=d3mat, vec=idVec)

然后将结果转换回矩阵:

    matrix(resultVec,3,3)
     [,1] [,2] [,3]
[1,]    9    6    7
[2,]    2    5    8
[3,]    7    4    1