Recuerda que en las ciencias un problema casi siempre tiene varias soluciones, por lo tanto aquí enseñaremos lo más óptimo y mejor.
Solución:
Podrías hacerlo así:
iterations = 10
variables = 2
output <- matrix(ncol=variables, nrow=iterations)
for(i in 1:iterations)
output[i,] <- runif(2)
output
y luego convertirlo en un data.frame
output <- data.frame(output)
class(output)
que hace esto:
- crear una matriz con filas y columnas de acuerdo con el crecimiento esperado
- insertar 2 números aleatorios en la matriz
- convertir esto en un marco de datos después el bucle ha terminado.
A menudo es preferible evitar los bucles y utilizar funciones vectorizadas. Si eso no es posible, hay dos enfoques:
- Preasignar su
data.frame
. Esto no se recomienda porque la indexación es lenta paradata.frames
. - Use otra estructura de datos en el ciclo y transfórmela en una
data.frame
después. Alist
es muy útil aquí.
Ejemplo para ilustrar el enfoque general:
mylist <- list() #create an empty list
for (i in 1:5)
vec <- numeric(5) #preallocate a numeric vector
for (j in 1:5) #fill the vector
vec[j] <- i^j
mylist[[i]] <- vec #put all vectors in the list
df <- do.call("rbind",mylist) #combine all vectors into a matrix
En este ejemplo no es necesario utilizar un list
puede preasignar un matrix
. Sin embargo, si no sabe cuántas iteraciones necesitará su ciclo, debe usar un list
.
Finalmente, aquí hay una alternativa vectorizada al bucle de ejemplo:
outer(1:5,1:5,function(i,j) i^j)
Como ves es más sencillo y también más eficiente.
esto también funciona
df = NULL
for (k in 1:10)
x = 1
y = 2
z = 3
df = rbind(df, data.frame(x,y,z))
la salida se verá así
df #enter
x y z #col names
1 2 3
Al final de la artículo puedes encontrar los informes de otros programadores, tú también puedes dejar el tuyo si dominas el tema.