2016-06-06 2 views
3

치수 (x, y, z) 차원 배열이 있고 차원 (x * y, z)의 행렬로 데이터를 재구성하려는 경우 다음과 같습니다.R 3d 배열을 2 차원 행렬

my_array <- array(1:600, dim=c(10,5,12)) 
my_matrix<-data.frame() 

for (j in 1:5) { 
    for (i in 1:10) { 
    my_matrix <- rbind (my_matrix, my_array[i,j,1:12]) 
} 
} 

더 빠르고 우아한 방법을 제안 할 수 있습니까? 치수를

res <- matrix(my_array, prod(dim(my_array)[1:2]), dim(my_array)[3]) 
all.equal(as.matrix(my_matrix), res, check.attributes=FALSE) 
#[1] TRUE 

주를 matrix를 호출하고 지정하여 우리는 matrix로 변환 할 수 있습니다

감사

답변

4

: 이것은 원래 'my_array` 변경되지 않습니다. 또한 실제로 코드는

matrix(my_array, 10*5, 12) 

으로 단순화하여 압축 할 수 있습니다.

nchar("matrix(my_array, 10*5, 12)") 
#[1] 26 

nchar("dim(my_array) <- c(10 * 5 , 12)") 
#[1] 31 
+0

안녕 Akrun, 당신은 당신의 코드 (all.equal (...))의 두 번째 줄을 보여주는 몇 가지 단어를 추가하십시오 수 있을까? thanks – Nemesi

+0

@ 네 메시 'my_matrix'의 결과가 내가 가진 것과 같은지 확인하는 것입니다. – akrun

+1

고마워요. – Nemesi

5

변경 배열의 차원 :

dim(my_array) <- c(10 * 5 , 12) 
+0

안녕하세요. 데이터의 순서가 유지됩니까? 첫 번째 y 열의 모든 z 값을 의미합니다. 두 번째 등등 ... – Nemesi

+0

두 응답을 모두 받아 들일 수 있으면 좋겠어요. 이것은 좋은 방법으로도 작업을 완료합니다. (나는 그것을 tho로 투표했습니다) – Nemesi

+1

안녕하세요, Nemesi. 나는 그 솔루션을 테스트했고 처음에 가지고 있던 것과 같은 결과를 냈다. 배열은 차원 속성이 인 벡터이므로이 간단한 솔루션이 작동하는 이유입니다. –

2

@akrun 모두와 @ 라스 아르네 Jordanger의 솔루션은 작업과 동일한 결과를 생성합니다.

의하여 두 용액 일 :

(1) 함께 모든 행렬의 첫번째 행을 연결하고, 합한 매트릭스의 상단에서 이러한 열을 위치시키는 단계; (2) 모든 행렬의 두 번째 행을 연결하고 첫 행의 연결 아래에 이러한 행을 배치하는 등의 작업을 수행 할 수 있습니다.

은 다음의 예는 잘 생각을 보여

> threeDimArray <- array(NA, dim=c(3,3,4)) 
> dims <- dim(threeDimArray) 
> 
> constants <- c(1, 10, 100) 
> for(id in 1:length(constants)){ 
    const <- constants[id] 
    threeDimArray[id,,] <- matrix((1:prod(dims[2:3]))*const, dims[2], dims[3]) 
} 
> threeDimArray[1,,] 
    [,1] [,2] [,3] [,4] 
[1,] 1 4 7 10 
[2,] 2 5 8 11 
[3,] 3 6 9 12 
> threeDimArray[2,,] 
    [,1] [,2] [,3] [,4] 
[1,] 10 40 70 100 
[2,] 20 50 80 110 
[3,] 30 60 90 120 
> threeDimArray[3,,] 
    [,1] [,2] [,3] [,4] 
[1,] 100 400 700 1000 
[2,] 200 500 800 1100 
[3,] 300 600 900 1200 
> # solution 1: 
> twoDimMat <- matrix(threeDimArray, prod(dims[1:2]), dims[3]) 
> twoDimMat 
     [,1] [,2] [,3] [,4] 
[1,] 1 4 7 10 
[2,] 10 40 70 100 
[3,] 100 400 700 1000 
[4,] 2 5 8 11 
[5,] 20 50 80 110 
[6,] 200 500 800 1100 
[7,] 3 6 9 12 
[8,] 30 60 90 120 
[9,] 300 600 900 1200 
> 
> # solution 2: 
> threeDArray <- threeDimArray 
> dim(threeDArray) <- c(prod(dims[1:2]), dims[3]) 
> threeDArray 
     [,1] [,2] [,3] [,4] 
[1,] 1 4 7 10 
[2,] 10 40 70 100 
[3,] 100 400 700 1000 
[4,] 2 5 8 11 
[5,] 20 50 80 110 
[6,] 200 500 800 1100 
[7,] 3 6 9 12 
[8,] 30 60 90 120 
[9,] 300 600 900 1200 
>