2012-03-04 4 views
6

나는 꽤 복잡한 패턴을 포함하는 행렬을 생성하기 위해 아래 코드를 작성했습니다. 이 경우 나는 시행 착오를 거쳐 완성 된 행렬에 136 행이 있다고 판단했습니다.R : 알 수없는 행 수의 행렬 만들기

미리 행렬 수를 계산하는 함수를 작성할 수는 있지만 함수는 약간 복잡 할 수 있습니다. 이 예에서 행렬의 행 수 = ((4 * 3 + 1) + (3 * 3 + 1) + (2 * 3 + 1) + 1 * 3 + 1) * 4

행렬의 행 수를 하드 와이어하지 않고 R에서 행렬을 생성하는 쉽고 효율적인 방법이 있습니까? 즉, for-loops를 사용할 때 R이 필요에 따라 행렬에 행을 추가하는 쉬운 방법이 있습니까?

나는 루프를 통과 할 때마다 rbind를 사용하는 하나의 솔루션을 제시했지만 약간 복잡한 데다가 훨씬 쉬운 솔루션이 있는지 궁금해하고 있습니다.

이 질문이 이전 질문과 중복되는 경우 죄송합니다. 나는이 사이트에서 검색 기능을 사용하거나 인터넷 검색 엔진을 사용하여 유사한 질문을 찾지 못했습니다. 과거와 비슷한 질문을 찾았습니다.

다음은 rbind를 사용하는 예제 코드와 nrow = 136을 미리 설정하기 위해 시행 착오를 사용한 예제 코드의 두 세트입니다.

의견을 보내 주셔서 감사합니다.

v1  <- 5 
v2  <- 2 
v3  <- 2 
v4  <- (v1-1) 

my.matrix <- matrix(0, nrow=136, ncol=(v1+4)) 

i = 1 

for(a in 1:v2) { 
    for(b in 1:v3) { 
    for(c in 1:v4) { 
     for(d in (c+1):v1) { 

     if(d == (c+1)) l.s = 4 
     else   l.s = 3 

     for(e in 1:l.s) { 

      my.matrix[i,c] = 1 

      if(d == (c+1)) my.matrix[i,d] = (e-1) 
      else   my.matrix[i,d] = e 

      my.matrix[i,(v1+1)] = a 
      my.matrix[i,(v1+2)] = b 
      my.matrix[i,(v1+3)] = c 
      my.matrix[i,(v1+4)] = d 

      i <- i + 1 

     } 
     } 
    } 
    } 
} 

my.matrix2 <- matrix(0, nrow=1, ncol=(v1+4)) 
my.matrix3 <- matrix(0, nrow=1, ncol=(v1+4)) 

i = 1 

for(a in 1:v2) { 
    for(b in 1:v3) { 
    for(c in 1:v4) { 
     for(d in (c+1):v1) { 

     if(d == (c+1)) l.s = 4 
     else   l.s = 3 

     for(e in 1:l.s) { 

      my.matrix2[1,c] = 1 

      if(d == (c+1)) my.matrix2[1,d] = (e-1) 
      else   my.matrix2[1,d] = e 

      my.matrix2[1,(v1+1)] = a 
      my.matrix2[1,(v1+2)] = b 
      my.matrix2[1,(v1+3)] = c 
      my.matrix2[1,(v1+4)] = d 

      i <- i+1 

      if(i == 2) my.matrix3 <- my.matrix2 
      else  my.matrix3 <- rbind(my.matrix3, my.matrix2) 

      my.matrix2 <- matrix(0, nrow=1, ncol=(v1+4)) 

     } 
     } 
    } 
    } 
} 

all.equal(my.matrix, my.matrix3) 
+3

이를 'The R Inferno'서클 2의 주제입니다. http://www.burns-stat.com/pages/Tutor/R_inferno.pdf 지속적인 rbinding이나 cbinding을 피하는 것이 옳습니다. –

답변

6

당신은 당신이 모든 데이터

my.matrix <- matrix(0, nrow=v1*v2*v3*v4*4, ncol=(v1+4)) 

을 잡고 마지막에 그것을자를 수있을만큼 큰 매트릭스를 만들 수 있습니다 행렬의 크기에 약간의 상한이있는 경우.

my.matrix <- my.matrix[1:(i-1),] 
2

이것은 일반적인 형식입니다. data.framematrix 변환 : 당신은 당신의 문제 벡터 오늘이 솔루션 우연히 행 요소

+0

rbind는 동일한 크기를 갖기 위해 두 개의 인수가 필요합니다. –

1

을 포함

matrix <- NULL 
for(...){ 
... 
matrix <- rbind(matriz,vector) 
} 

에 적응 할 수 있습니다. for-loop에 의해 새 행이 필요한 경우 해당 행은 data.frame에 자동으로 추가됩니다. 원하는 경우 data.framematrix으로 다시 변환 할 수 있습니다. 나는 이것이 이것이 rbind의 반복 사용과 비슷한 것을 구성하는지 확신하지 못한다. 아마도 그것은 큰 data.frames으로 매우 느리게됩니다. 나도 몰라.

my.data <- matrix(0, ncol = 3, nrow = 2) 
my.data <- as.data.frame(my.data) 

j <- 1 

for(i1 in 0:2) { 
    for(i2 in 0:2) { 
      for(i3 in 0:2) { 

        my.data[j,1] <- i1 
        my.data[j,2] <- i2 
        my.data[j,3] <- i3 

        j <- j + 1 

      } 
    } 
} 

my.data 
my.data <- as.matrix(my.data) 
dim(my.data) 
class(my.data) 

편집 : 2015년 7월 27일

또한 빈 data.frame 다음 마지막에 matrixdata.frame 변환 생성, 첫 matrix 문을 삭제할 수 있습니다

my.data <- data.frame(NULL,NULL,NULL) 

j <- 1 

for(i1 in 0:2) { 
    for(i2 in 0:2) { 
      for(i3 in 0:2) { 

        my.data[j,1] <- i1 
        my.data[j,2] <- i2 
        my.data[j,3] <- i3 

        j <- j + 1 
      } 
    } 
} 

my.data 
my.data <- as.matrix(my.data) 
dim(my.data) 
class(my.data) 
관련 문제