从三维数组中的行形成矩阵

时间:2010-07-09 04:09:00

标签: r

我有X,是R中的三维数组。我想采用索引indx的矢量(长度等于dim(X)[1])并形成第一行的矩阵是X[ , , indx[1]]的第一行,第二行是X[ , , indx[2]]的第二行,依此类推。

例如,我有:

R> X <- array(1:18, dim = c(3, 2, 3))
R> X
, , 1

     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

, , 2

     [,1] [,2]
[1,]    7   10
[2,]    8   11
[3,]    9   12

, , 3

     [,1] [,2]
[1,]   13   16
[2,]   14   17
[3,]   15   18

R> indx <- c(2, 3, 1)

我想要的输出是

R> rbind(X[1, , 2], X[2, , 3], X[3, , 1])
     [,1] [,2]
[1,]    7   10
[2,]   14   17
[3,]    3    6

截至目前,我正在使用不优雅(慢)sapply(1:dim(X)[2], function(x) X[cbind(1:3, x, indx)])。有没有办法使用内置的索引功能?我没有运气试验?Extract中描述的矩阵索引方法,但我可能只是做错了。

3 个答案:

答案 0 :(得分:2)

也许是这样的:

t(sapply(1:3,function(x) X[,,idx][x,,x]))

答案 1 :(得分:1)

我可能正在回答错误的问题(我无法调和您的第一个描述和您的示例输出)...这会产生您的样本输出,但我不能说如果不在数据上运行它会更快。

do.call(rbind, lapply(1:dim(X)[1], function(i) X[i, , indx[i]]))

答案 2 :(得分:1)

矩阵索引救援!不需要apply

找出你想要的指数:

n <- dim(X)[2]
foo <- cbind(rep(seq_along(indx),n),
             rep(seq.int(n), each=length(indx)),
             rep(indx,n))

(结果是这样)

     [,1] [,2] [,3]
[1,]    1    1    2
[2,]    2    1    3
[3,]    3    1    1
[4,]    1    2    2
[5,]    2    2    3
[6,]    3    2    1

并将其用作索引,转换回矩阵使其看起来像输出。

> matrix(X[foo],ncol=n)
     [,1] [,2]
[1,]    7   10
[2,]   14   17
[3,]    3    6