2012-03-04 25 views
6

He escrito el código siguiente para generar una matriz que contiene, para mí, un patrón bastante complejo. En este caso, determiné que hay 136 filas en la matriz terminada por prueba y error.R: crear una matriz con un número desconocido de filas

Podría escribir una función para calcular el número de filas de la matriz por adelantado, pero la función sería un poco compleja. En este ejemplo, el número de filas en la matriz = ((4 * 3 + 1) + (3 * 3 + 1) + (2 * 3 + 1) + (1 * 3 + 1)) * 4.

¿Existe una manera fácil y eficiente de crear matrices en R sin cablear el número de filas en la declaración de la matriz? En otras palabras, ¿hay una manera fácil de dejar que R simplemente agregue una fila a una matriz según sea necesario cuando se utilizan for-loops?

He presentado una solución que emplea rbind en cada pasada a través de los bucles, pero parece un poco intrincado y me preguntaba si podría haber una solución mucho más fácil.

Lo siento si esta pregunta es redundante con una pregunta anterior. No pude encontrar una pregunta similar usando la función de búsqueda en este sitio o usando un motor de búsqueda en Internet hoy, aunque creo que encontré una pregunta similar en algún lugar del pasado.

A continuación se muestran 2 conjuntos de código de ejemplo, uno que usa rbind y el otro donde usé prueba y error para establecer nrow = 136 por adelantado.

Gracias por cualquier sugerencia.

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

Este es el tema del Círculo 2 de 'The R Inferno' http://www.burns-stat.com/pages/Tutor/R_inferno.pdf. Tiene razón para evitar el encuadernado continuo. –

Respuesta

6

Si tiene algún límite superior en el tamaño de la matriz, puede crear una matriz suficientemente grande para contener todos los datos

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

y trunca al final.

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

Esta es la forma genérica para hacerlo. Se puede adaptar a su problema

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

donde vector contiene los elementos de fila

+0

rbind necesita sus dos argumentos para tener las mismas dimensiones –

1

me encontré con este hoy solución: convertir el matrix a un data.frame. Como se necesitan nuevas filas en el for-loop, esas filas se agregan automáticamente al data.frame. Luego puede convertir el data.frame de nuevo a matrix al final si lo desea. No estoy seguro de si esto constituye algo similar al uso iterativo de rbind. Tal vez se vuelve muy lento con grandes data.frames. No lo sé.

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) 

EDITAR: July 27, el año 2015

También puede eliminar la primera matrix declaración, crean un vacío data.frame continuación, convertir el data.frame a un matrix al final:

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) 
Cuestiones relacionadas