2010-07-09 3 views
2

나는 R의 입체 배열 X을 가지고 있습니다. indx (길이는 dim(X)[1]과 같습니다)의 벡터를 가져 와서 첫 행이 첫 행인 행렬을 만들고 싶습니다 행 X[ , , indx[1]], 두 번째 행은 X[ , , indx[2]]의 두 번째 행, 등등입니다.3 차원 배열의 행에서 양식 행렬

예를 들어, 내가 가진 : 나는 우아 (느린) sapply(1:dim(X)[2], function(x) X[cbind(1:3, x, indx)])를 사용하고 현재로서는

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 

입니다. 기본 제공 인덱싱 함수를 사용하여이를 수행 할 수있는 방법이 있습니까? 나는 행운을 ?Extract에 설명 된 행렬 색인 방법으로 실험했지만, 잘못했을 수도 있습니다. 어쩌면이 같은

+0

관련 항목 : http://stackoverflow.com/q/3551955/210673 – Aaron

답변

2

:

t(sapply(1:3,function(x) X[,,idx][x,,x])) 
1
나는 (내가 처음 설명 및 샘플 출력을 조정할 수 없습니다) 잘못된 질문에 대답 할 수있다

이 ... 이것은 샘플 출력을 생성하지만, 그럴 수 없어 데이터를 실행하지 않고는 속도가 훨씬 빠르다고 말하십시오. 구조에

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

1

행렬 인덱스! apply이 필요합니다. 당신이 원하는와 indices

그림 아웃 :

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 
관련 문제