2014-06-18 3 views
4

저는 3 차원 배열을 가지고 있고, 하나의 차원을 행별로 쌓아서 (1 차원의 행을 결합하여) 2 차원으로 축소하려고합니다. 제 코드에서는 각 색인에 2 차원 배열로 "워크 시트"(3 차원)을 채웠습니다. 이제는이 3 차원 배열을 가져 와서이 시트의 행을 서로 겹치기를 원합니다. 여기2D 배열을 만들기 위해 시트 배열을 3D 배열에 바인딩합니다.

예를 들어 배열 그래서 내가 최종 결과 모양을하고 싶은 설명 할 수 : 2에서 서로 위에 쌓인하는 내가 w, x, y, z 싶습니다

x <- array(1:24, dim=c(2, 3, 4), 
      dimnames=list(letters[1:2], LETTERS[1:3], letters[23:26])) 
dim(x) 

차원 행은 8 행 3 열을 가질 것입니다.

x1<-x[,,1] 
x2<-x[,,2] 
x3<-x[,,3] 
x4<-x[,,4] 

All<-rbind(x1,x2,x3,x4) 

내가 abindadrop 살펴 보았다 그러나 그들은 매우 잘되지 않습니다 : 여기에 (내 루프에서 가능한 한하지 않음) 복잡 그것을 할 수있는 방법입니다. 내가 만들 수

는 또한 aperm을 시도했지만 난 그냥 트랜스 (?)

을 또는이와 크기를 줄일 수 있다고 생각하지 않는 list (배열이있을 수 있기 때문에이 사실, 이상적 일 것이다 다른 행 번호). 이 경우 목록에서 여러 요소의 행을 같은 방식으로 결합하는 방법은 무엇입니까?

감사합니다.

+0

'abind' 패키지를보세요 –

+3

'apply (x, 2, c)'어쩌면? – thelatemail

+0

Q를 잘못 해석했기 때문에 내 대답을 삭제했습니다. @thelatemail이 켜져 있습니다. 리스트를 가지고 작업하고 싶다면'L'리스트에'do.call (rbind, L)'을 쓰면된다. – jbaums

답변

4

답변에 대한 내 의견을 홍보 하겠지만 치수를 변경하는 방법이 있어야한다고 생각합니다.

apply(x, 2, c) 
#or if you're really pushing for speed, the simpler function: 
apply(x, 2, identity) 

# Giving: 
#  A B C 
#[1,] 1 3 5 
#[2,] 2 4 6 
#[3,] 7 9 11 
#[4,] 8 10 12 
#[5,] 13 15 17 
#[6,] 14 16 18 
#[7,] 19 21 23 
#[8,] 20 22 24 

는 요청 된 출력 산세에게 rownames 일치 :

all.equal(apply(x,2,c), All, check.attributes=FALSE) 
#[1] TRUE 
+0

나는 오래전에이 문제를 보았고이 접근법을 발견했다. [Gabor의 호의] (https://stat.ethz.ch/pipermail/r-help/2006-July/109341.html). 나는 그것을 기억하기 위해 정신적으로 메모를 만들었지 만 분명히하지는 않았다. – jbaums

+0

그것이 OP가 제공 한 것만 제외하고. 'do.call (rbind, lapply (1 : dim (x) [[3]], function (s)))' –

+0

@BondedDust : 그것이 나에게 지시된다고 가정하면 , Gabor는'apply (y, 2, I)'가'rbind' 결과와 동일하다는 것을 보여주었습니다 :) – jbaums

1

다음은 치수를 조작하여 그 방법은 다음과 같습니다 당신이 필요한 경우

y <- aperm(x, c(1, 3, 2)) 
dim(y) <- c(prod(dim(x)[-2]), dim(x)[2]) 
# the above evaluates to c(8, 3) 

y 

#  [,1] [,2] [,3] 
# [1,] 1 3 5 
# [2,] 2 4 6 
# [3,] 7 9 11 
# [4,] 8 10 12 
# [5,] 13 15 17 
# [6,] 14 16 18 
# [7,] 19 21 23 
# [8,] 20 22 24  

colnames(y) <- colnames(x)와 함께하십시오.

관련 문제