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)
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. –