Detener un Bucle Cuando se Cumple una Condición
Estoy trabajando con el lenguaje de programación R. Creé el siguiente bucle que genera 1000 números aleatorios y luego repite este proceso 10 veces:
resultados <- lista()
for (i en 1:10){
a = rnorm(1000,10,1)
b = rnorm(1000,10,1)
d_i = data.frame(a,b)
d_i$index = 1:nrow(d_i)
d_i$iteration = as.factor(i)
resultados[[i]] <- d_i
}
resultados_df <- do.call(rbind.data.frame, resultados)
Pregunta: Me gustaría cambiar este bucle para que en lugar de solo generar 1000 números aleatorios, siga generando números aleatorios hasta que se cumpla una cierta condición, por ejemplo: CONTINUAR generando números aleatorios HASTA QUE da> 10 Y di>b> 10 .
Usando una declaración “WHILE()”, intenté hacer esto:
resultados <- lista()
for (i en 1:10){
while (d_i$a > 10 && d_i$b >10) {
a = rnorm(1000,10,1)
b = rnorm(1000,10,1)
d_i = data.frame(a,b)
d_i$index = 1:nrow(d_i)
d_i$iteration = as.factor(i)
resultados[[i]] <- d_i
}
}
resultados_df <- do.call(rbind.data.frame, resultados)
Problema: sin embargo, esto devuelve las siguientes advertencias (10 veces):
Mensajes de advertencia:
1: En while (d_i$a > 10 && d_i$b > 10) { :
la condición tiene una longitud > 1 y solo se usará el primer elemento
Y produce una tabla vacía:
resultados_df
marco de datos con 0 columnas y 0 filas
¿Alguien puede ayudarme a solucionar este problema?
¡Gracias!
davy.ai
Para solucionar este problema, es necesario mover la creación del data frame ‘d_i’ fuera del ciclo while, de manera que primero sea creado con algunos valores iniciales y luego actualizado hasta que se cumpla la condición. Además, también se debe agregar un contador para asegurarse de que el ciclo no se ejecute infinitamente. Aquí está el código corregido:
Aquí, primero creamos ‘d_i’ con algunos valores iniciales y luego usamos un ciclo while para actualizarlo hasta que tanto ‘d_i$a’ como ‘d_i$b’ sean mayores a 10. La variable ‘counter’ lleva un seguimiento del número de iteraciones y se utiliza para crear un índice único para cada nueva fila agregada a ‘d_i’. Los resultados finales se almacenan en ‘results’, que luego se combinan en un solo data frame utilizando ‘do.call(rbind.data.frame, results)’.