2012-03-04 13 views
6

Ho scritto il codice qui sotto per generare una matrice contenente quello che per me è uno schema abbastanza complesso. In questo caso ho determinato che ci sono 136 righe nella matrice finita per tentativi ed errori.R: creazione di una matrice con un numero sconosciuto di righe

Potrei scrivere una funzione per calcolare il numero di righe di matrice in anticipo, ma la funzione sarebbe un po 'complessa. In questo esempio il numero di righe nella matrice = ((4 * 3 + 1) + (3 * 3 + 1) + (2 * 3 + 1) + (1 * 3 + 1)) * 4.

Esiste un modo semplice ed efficace per creare matrici in R senza cablare il numero di righe nell'istruzione matrice? In altre parole, c'è un modo semplice per consentire a R di aggiungere semplicemente una riga a una matrice, se necessario, quando si usano i cicli for?

Ho presentato una soluzione che utilizza rbind ad ogni passaggio attraverso i loop, ma ciò sembra un po 'contorto e mi chiedevo se ci potesse essere una soluzione molto più semplice.

Siamo spiacenti se questa domanda è ridondante con una domanda precedente. Non sono riuscito a trovare una domanda simile usando la funzione di ricerca su questo sito o utilizzando un motore di ricerca internet oggi, anche se penso di aver trovato una domanda simile da qualche parte nel passato.

Di seguito sono riportati 2 set di codice di esempio, uno che utilizza rbind e l'altro in cui ho utilizzato tentativi ed errori per impostare anticipatamente nrow = 136.

Grazie per eventuali suggerimenti.

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

Questo è il soggetto di Circle 2 di 'The R Inferno' http://www.burns-stat.com/pages/Tutor/R_inferno.pdf Hai ragione di evitare il riavvolgimento continuo o il cbinding. –

risposta

6

Se avete qualche limite superiore alla dimensione della matrice, è possibile creare una matrice abbastanza grande da contenere tutti i dati

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

e troncare alla fine.

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

Questo è il modulo generico per farlo. È possibile adattarlo al vostro problema

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

dove vettore contiene gli elementi di riga

+0

rbind richiede i suoi due argomenti per avere le stesse dimensioni –

1

mi sono imbattuto su questa soluzione oggi: convertire il matrix ad un data.frame. Poiché le nuove righe sono necessarie per il numero for-loop, tali righe vengono automaticamente aggiunte allo data.frame. Quindi, se lo desideri, puoi convertire lo data.frame in un matrix alla fine. Non sono sicuro se ciò costituisca qualcosa di simile all'utilizzo iterativo di rbind. Forse diventa molto lento con grande data.frames. Non lo so.

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) 

EDIT: 27 Luglio 2015

È inoltre possibile eliminare il primo matrix dichiarazione, creare un vuoto data.frame quindi convertire il data.frame ad un matrix alla fine:

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) 
Problemi correlati