2016-09-06 214 views
4

我在R中編碼,並且我有一個包含數據的3維數組(在本例中爲ab)。然後我有一個包含第三個數組維度(idx)索引的矩陣。該矩陣具有相同數量的行和列數組。我想使用idx中包含的索引從數組中提取數據,以獲得具有相同維度idx的矩陣。請看下面的例子:R:使用索引矩陣從數組中提取矩陣

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] 

有沒有人知道我怎麼能得到它?

非常感謝!

薩拉

回答

3

我們需要用於行/列和第三維度中的索引(從「IDX」),以提取的元素。我們通過cbind這個行索引,列索引和'idx'來做到這一點。

i1 <- dim(ab)[1] 
j1 <- dim(ab)[2] 
matrix(ab[cbind(rep(seq_len(i1), j1),rep(seq_len(j1), each = i1), c(idx))], ncol=3) 
#  [,1] [,2] [,3] 
#[1,] 9 6 3 
#[2,] 8 5 8 
#[3,] 3 6 9 
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 

然後我apllied一個函數來向量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