es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  , , ,

Answer

  1. Avatar for 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:

    results <- list()
    
    for (i in 1:10){
    
        # inicializar el data frame con algunos valores iniciales
        a = rnorm(1,10,1)
        b = rnorm(1,10,1)
        d_i = data.frame(a,b)
        d_i$index = 1:nrow(d_i)
        d_i$iteration = as.factor(i)
    
        counter <- 1
    
        # actualizar el data frame hasta que se cumpla la condición
        while (d_i$a <= 10 | d_i$b <= 10) {
            a = rnorm(1,10,1)
            b = rnorm(1,10,1)
    
            d_i_new = data.frame(a,b)
            d_i_new$index = counter + 1
            d_i_new$iteration = as.factor(i)
    
            d_i <- rbind(d_i, d_i_new)
            counter <- counter + 1
        }
    
        results[[i]] <- d_i
    
    }
    
    results_df <- do.call(rbind.data.frame, results)
    

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

Comments are closed.