2012-03-04 53 views
6

我已經寫了下面的代碼生成包含什麼,對我來說,一個相當複雜的模式矩陣的矩陣。在這種情況下,我通過反覆試驗確定完成矩陣中有136行。R:創建未知的行數

我可以寫一個函數來計算提前矩陣的行數,但功能會有點複雜。在該示例中的行中的矩陣=((4×3 + 1)+(3 * 3 + 1)+(2 * 3 + 1)+(1×3 + 1))* 4

有沒有簡單而有效的方法來創建矩陣R中沒有硬連線矩陣語句的行數?換句話說,有沒有一種簡單的方法讓R在使用for-loops時根據需要添加一行到矩陣?

我已經提出了一個解決方案,在每次通過循環使用rbind,但似乎有點令人費解,我想知道是否有可能是一個更容易的解決方案。

很抱歉,如果這個問題是多餘的前面一個問題。我找不到使用本網站上的搜索功能或今天使用互聯網搜索引擎的類似問題,但我認爲我在過去的某個地方發現了類似的問題。

下面是2套的實施例的代碼,一個使用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你是對的,以避免不斷的綁定或綁定。 – 2012-03-04 15:44:37

回答

6

如果你對矩陣的大小, 您可以創建 大到足以容納所有數據

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

,並在年底截斷它的矩陣一些上限。

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

這是做這件事的一般形式。你可以把它適應您的問題

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

其中載體包含行元素

+0

rbind需要它的兩個參數具有相同的尺寸 – 2016-11-09 23:23:42

1

我今天在這個解決方案偶然:轉換matrixdata.frame。由於for-loop需要新行,因此這些行會自動添加到data.frame。然後,如果需要,您可以在末尾將data.frame轉換回matrix。我不確定這是否構成類似於迭代使用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日

您也可以刪除第一matrix聲明,創建一個空data.frame然後轉換data.framematrix底:

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)