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