R: Logique Conditions Ne Sont Pas Respectées

0

La question

Je travaille avec le R langage de programmation. Je suis en train de construire une boucle qui exécute les actions suivantes :

  • Etape 1: générer deux nombres aléatoires "a" et "b" jusqu'à ce que les deux "a" et "b" sont plus que 12

  • Étape 2: savoir combien de nombres aléatoires a dû être généré jusqu'à ce qu'il a pris pour l'Étape 1 pour être complété

  • Étape 3: Répétez l'Étape 1 et l'Étape 2 100 fois

Depuis je ne sais pas comment garder la génération de nombres aléatoires jusqu'à ce qu'une condition est remplie, j'ai essayé de générer une grande quantité de nombres aléatoires en espérant que la condition est remplie (il y a sans doute une meilleure façon d'écrire ceci):

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)

Problème: Quand je regarde les résultats, j'ai remarqué que la boucle est mal compte tenu de la condition à remplir, par exemple:

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

Par exemple, dans chacun de ces lignes - à la fois "a" et "b" sont plus petits que 12.

Personne ne sait pourquoi ce qui se passe et quelqu'un merci de me montrer comment résoudre ce problème?

Merci!

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

La meilleure réponse

4

Comment parler de cette façon? Comme vous le tag while-loop, J'ai essayé de l'utiliser.

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

Dans d'autres langues

Cette page est dans d'autres langues

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