2012-03-04 54 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)