R: Condiciones Lógicas Que No Se Respetan

0

Pregunta

Estoy trabajando con el departamento de I lenguaje de programación. Estoy tratando de construir un bucle en el que se realiza lo siguiente :

  • Paso 1: Mantenga la generación al azar dos números "a" y "b" hasta "a" y "b" son más de 12

  • Paso 2: realizar el Seguimiento de cuántos números aleatorios tuvo que ser generado hasta que se tomó para el Paso 1 para ser completado

  • Paso 3: Repita el Paso 1 y el Paso 2 100 veces

Ya no sé cómo mantener la generación de números aleatorios hasta que se cumpla una condición, traté de generar una gran cantidad de números aleatorios con la esperanza de que la condición se cumple (es probable que exista una mejor manera de escribir esto):

results <- list()


for (i in 1:100){
  
  # do until break
  repeat {
    
    # repeat many random numbers
    a = rnorm(10000,10,1)
    b = rnorm(10000,10,1)
    
    # does any pair meet the requirement
    if (any(a > 12 & b > 12)) {
      
      # put it in a data.frame
      d_i = data.frame(a,b)
      
      # end repeat
      break
    }
  }
  
  # select all rows until the first time the requirement is met
  # it must be met, otherwise the loop would not have ended
  d_i <- d_i[1:which(d_i$a > 10 & d_i$b > 10)[1], ]
  
  # prep other variables and only keep last row (i.e. the row where the condition was met)
  d_i$index = seq_len(nrow(d_i))
  d_i$iteration = as.factor(i)
e_i = d_i[nrow(d_i),]
  
  results[[i]] <- e_i
  
}

results_df <- do.call(rbind.data.frame, results)

Problema: Cuando veo los resultados, me di cuenta de que el bucle está mal teniendo en cuenta que la condición se cumple, por ejemplo:

head(results_df)

          a        b index iteration
4  10.29053 10.56263     4         1
5  10.95308 10.32236     5         2
3  10.74808 10.50135     3         3
13 11.87705 10.75067    13         4
1  10.17850 10.58678     1         5
14 10.14741 11.07238     1         6

Por ejemplo, en cada una de estas filas - "a" y "b" son menores de 12 años.

¿Alguien sabe por qué ocurre esto y por favor alguien puede mostrarme cómo solucionar este problema?

Gracias!

data-manipulation loops r while-loop
2021-11-24 02:45:09
1

Mejor respuesta

4

¿De esta forma? Como etiqueta while-loop, Traté de usarlo.

res <- matrix(0, nrow = 0, ncol = 3)    

for (j in 1:100){
  a <- rnorm(1, 10, 1)
  b <- rnorm(1, 10, 1)
  i <- 1
  while(a < 12 | b < 12) {
    a <- rnorm(1, 10, 1)
    b <- rnorm(1, 10, 1)
    i <- i + 1
  }
  x <- c(a,b,i)
  res <- rbind(res, x)
}

head(res)
      [,1]     [,2] [,3]
x 12.14232 12.08977  399
x 12.27158 12.01319 1695
x 12.57345 12.42135  302
x 12.07494 12.64841  600
x 12.03210 12.07949   82
x 12.34006 12.00365  782

dim(res)
[1] 100   3
2021-11-24 02:52:21

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................