2012-07-17 6 views
3

저는 3 개의 공간 차원과 x, y, z, t 차원의 시간 차원으로 구성된 4 차원 배열로 구성된 R의 일부 데이터 작업을하고 있습니다. 필자의 분석 중 일부는 공간 좌표 x, y, z에 대한 시간 차원의 모든 데이터를 얻고 싶습니다. 지금까지, 나는 관심있는 공간 위치의 인덱스를 얻기 위해 어떤 함수를 사용했다. 그러나 공간 위치에 해당하는 시간 차원의 모든 관련 데이터를 얻으려고하면 우아한 R 솔루션을 찾을 수없고 포팅 된 MATLAB 함수 인 repmat을 사용합니다.다차원 R 배열을 동적으로 색인화하는 방법은 무엇입니까?

a4d <- array(rnorm(10000), rep(10,4)) #x, y, z, t 

#arbitrary set of 3d spatial indices x, y, z (here, using high values at first timepoint) 
indices <- which(a4d[,,,1] > 2, arr.ind=TRUE) 
str(indices) 

# int [1:20, 1:3] 10 2 6 5 8 2 6 8 2 10 ... 
# - attr(*, "dimnames")=List of 2 
# ..$ : NULL 
# ..$ : chr [1:3] "dim1" "dim2" "dim3" 

#Now, I would like to use these indices to get data x, y, z for all t 

#Intuitive, but invalid, syntax (also not clear what the structure of the data would be) 
#a4d[indices,] 

#Ugly, but working, syntax 
library(pracma) 

#number of timepoints 
nt <- dim(a4d)[4] 

#create a 4d lookup matrix 
lookup <- cbind(repmat(indices, nt, 1), rep(1:nt, each=nrow(indices))) 

#obtain values at each timepoint for indices x, y, z 
result <- cbind(lookup, a4d[lookup]) 

이 솔루션은 명시된 목적에는 정상적으로 작동하지만 개념적으로는보기 흉한 것처럼 보입니다. 이상적으로, 나는 2 차원 행렬을 마지막에 나타낼 것입니다 : index x time. 따라서이 경우 조회에서 20 x, y, z 좌표 및 10 개의 시간 지점을 사용하면 행이 각 행의 행을 나타내는 경우 20 x 10 행렬이 이상적입니다 (x, y, z를 보존 할 필요가 없음). , 값 필연적으로) 각 열은 시간 지점입니다.

R에서 이것을 수행하는 좋은 방법이 있습니까? 내가 do.call ("[", 목록 ... 등을 외부 및 자극을 사용하여 주위를 연주했지만,이 내가 기대했던대로 일을하지 않았습니다.

감사 어떤 제안! 마이클

답변

7

하지 않으 :

apply(a4d, 4, `[`, indices) 

그리고 우리의 결과가 일치하는지 확인 :

?를
result1 <- matrix(result[,5], ncol = 10) 
result2 <- apply(a4d, 4, `[`, indices) 
identical(result1, result2) 
# [1] TRUE 
+0

감사합니다. flodel! 나는이 문제를 필요 이상으로 복잡하게 만들고 있음을 알았다. 네, 첫 번째 3에 대한 색인과 함께 마지막 차원을 따라 적용하면 꼭 필요한 것입니다. 당신의 도움을 주셔서 감사합니다. -남자 이름 –

1

은 아마 뭔가를 실종 해요,하지만 당신은 단순히 당신이 찾고있는 생각 a4d[indices[,1],indices[,2],indices[,3],]

1

각 차원별로 개별적으로 액세스하는 것은 @ tilo-wiklund처럼 작동하지 않습니다. 10 개의 시간 단계에 걸쳐 23 개의 행 대신에, 결과는 10 개의 시간 단계에 걸쳐 23x23x23 큐브입니다.

r.idvdim <- a4d[indices[,1],indices[,2],indices[,3],] 
r.apply <- apply(a4d, 4, `[`, indices) 
r.cbind <- matrix(a4d[lookup],ncol=nt) 

dim(r.idvdim)  # [1] 23 23 23 10 
dim(r.apply)  # [1] 23 10 
dim(r.cbind)  # [1] 23 10 
관련 문제