我有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
中描述的矩阵索引方法,但我可能只是做错了。
答案 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