For loop in R is repeating answers more times than desired

Asked

Viewed 34 times

0

I need help for this loop that is returning more answers than desired.

I made a table from the public dataset palmerpenguins and my goal is to get an estimate of the penguins' gender with missing data via comparison with the average male. The literature says that if the male is 11% larger then x may be female.

The first loop I created for this effect returns more answers than I intend and I do not know how to tidy up. I made a second simpler loop that returns the number of desired answers, but does not refer to the penguin’s number.

What I’m doing wrong in the first?

tabela_pinguins <- data.frame (

  numero_pinguim <- c(179,219,257,269,9,10,11,12,48),

  percentagem_da_diferenca <- c(24, 14, 13, 10, 13, -4, 17, 8, 25))

  for ( x in tabela_pinguins$percentagem_da_diferenca) {

    if(x > 11){
      numero_pinguim_femea <- which(tabela_pinguins$percentagem_da_diferenca> 11)
      mensagem1 <- paste("O pinguim", tabela_pinguins$numero_pinguim[numero_pinguim_femea], "é provavelmente uma fêmea.") 
      print(mensagem1)

    }else if (x<0){
   numero_pinguim_macho <- which(tabela_pinguins$percentagem_da_diferenca<0)
   mensagem2 <- paste("O pinguim", tabela_pinguins$numero_pinguim[numero_pinguim_macho], "é provavelmente um macho.") 
   print(mensagem2)

    } else {
   numero_pinguim_inconclusivo <- which(tabela_pinguins$percentagem_da_diferenca>0 & tabela_pinguins$percentagem<11)
   mensagem3 <- paste("Inconclusivo: O pinguim", tabela_pinguins$numero_pinguim[numero_pinguim_inconclusivo], "pode ser macho ou fêmea.")
   print(mensagem3)}
  }

This loop returns:

[1] "O pinguim 179 é provavelmente uma fêmea." "O pinguim 219 é provavelmente uma fêmea."
[3] "O pinguim 257 é provavelmente uma fêmea." "O pinguim 9 é provavelmente uma fêmea."  
[5] "O pinguim 11 é provavelmente uma fêmea."  "O pinguim 48 é provavelmente uma fêmea." 
[1] "O pinguim 179 é provavelmente uma fêmea." "O pinguim 219 é provavelmente uma fêmea."
[3] "O pinguim 257 é provavelmente uma fêmea." "O pinguim 9 é provavelmente uma fêmea."  
[5] "O pinguim 11 é provavelmente uma fêmea."  "O pinguim 48 é provavelmente uma fêmea." 
[1] "O pinguim 179 é provavelmente uma fêmea." "O pinguim 219 é provavelmente uma fêmea."
[3] "O pinguim 257 é provavelmente uma fêmea." "O pinguim 9 é provavelmente uma fêmea."  
[5] "O pinguim 11 é provavelmente uma fêmea."  "O pinguim 48 é provavelmente uma fêmea." 
[1] "Inconclusivo: O pinguim 269 pode ser macho ou fêmea."
[2] "Inconclusivo: O pinguim 12 pode ser macho ou fêmea." 
[1] "O pinguim 179 é provavelmente uma fêmea." "O pinguim 219 é provavelmente uma fêmea."
[3] "O pinguim 257 é provavelmente uma fêmea." "O pinguim 9 é provavelmente uma fêmea."  
[5] "O pinguim 11 é provavelmente uma fêmea."  "O pinguim 48 é provavelmente uma fêmea." 
[1] "O pingum 10 é provavelmente um macho."
[1] "O pinguim 179 é provavelmente uma fêmea." "O pinguim 219 é provavelmente uma fêmea."
[3] "O pinguim 257 é provavelmente uma fêmea." "O pinguim 9 é provavelmente uma fêmea."  
[5] "O pinguim 11 é provavelmente uma fêmea."  "O pinguim 48 é provavelmente uma fêmea." 
[1] "Inconclusivo: O pinguim 269 pode ser macho ou fêmea."
[2] "Inconclusivo: O pinguim 12 pode ser macho ou fêmea." 
[1] "O pinguim 179 é provavelmente uma fêmea." "O pinguim 219 é provavelmente uma fêmea."
[3] "O pinguim 257 é provavelmente uma fêmea." "O pinguim 9 é provavelmente uma fêmea."  
[5] "O pinguim 11 é provavelmente uma fêmea."  "O pinguim 48 é provavelmente uma fêmea." 

I wanted the top loop to return the same as this below loop (the order is right) but with reference to the penguin number in the answer.

for(x in tabela_pinguins$percentagem_da_diferenca) {

  if(x>11) {
  print("O pinguim é provavelmente uma fêmea.")
} else if (x<0) {
  print("O pinguim é provavelmente um macho.")
} else {
    print("Inconclusivo: O pinguim pode ser macho ou fêmea.")}
  }

this returns:

[1] "O pinguim é provavelmente uma fêmea."
[1] "O pinguim é provavelmente uma fêmea."
[1] "O pinguim é provavelmente uma fêmea."
[1] "Inconclusivo: O pinguim pode ser macho ou fêmea."
[1] "O pinguim é provavelmente uma fêmea."
[1] "O pinguim é provavelmente um macho."
[1] "O pinguim é provavelmente uma fêmea."
[1] "Inconclusivo: O pinguim pode ser macho ou fêmea."
[1] "O pinguim é provavelmente uma fêmea.
  • The estimate is that the male has to be ONLY 11% higher, or HIGHER OR EQUAL to 11% or UP to 11% higher? One thing is estimativa = 11, something else is estimativa >= 11 and something else is estimativa <= 11.

  • Thanks for the reply @solkarped! You’re right. the estimate would be better if it was >= 11. I tried this alternative but did not return the desired answer.

1 answer

1


The problem of the first loop is in the snippets of code given by

numero_pinguim_femea <- which(tabela_pinguins$percentagem_da_diferenca> 11)
numero_pinguim_macho <- which(tabela_pinguins$percentagem_da_diferenca<0)
numero_pinguim_inconclusivo <- which(tabela_pinguins$percentagem_da_diferenca>0 & tabela_pinguins$percentagem<11

These results are respectively

numero_pinguim_femea
## [1] 1 2 3 5 7 9
numero_pinguim_macho
## [1] 6
numero_pinguim_inconclusivo
## [1] 4 8

With this, only the result of the male penguin is unique in the first output. All others only reflect the fact that the number of female or inconclusive penguins is greater than 1.

To solve this, it is necessary that, for each x in his for, only a penguin is considered with the which. One way to do this is to add a second counter i within the loop, which traverses the penguin numbers and is updated manually after the logical tests:

i <- 1

for (x in tabela_pinguins$percentagem_da_diferenca){
  
  if(x > 11){
    numero_pinguim_femea <- tabela_pinguins$numero_pinguim[i]
    mensagem1 <- paste("O pinguim", numero_pinguim_femea, "é provavelmente uma fêmea.") 
    print(mensagem1)
    
  } else if (x < 0) {
    numero_pinguim_macho <- tabela_pinguins$numero_pinguim[i]
    mensagem2 <- paste("O pinguim", numero_pinguim_macho, "é provavelmente um macho.") 
    print(mensagem2)
    
  } else {
    numero_pinguim_inconclusivo <- tabela_pinguins$numero_pinguim[i]
    mensagem3 <- paste("Inconclusivo: O pinguim", numero_pinguim_inconclusivo, "pode ser macho ou fêmea.")
    print(mensagem3)}
  
  i <- i + 1
}

## [1] "O pinguim 179 é provavelmente uma fêmea."
## [1] "O pinguim 219 é provavelmente uma fêmea."
## [1] "O pinguim 257 é provavelmente uma fêmea."
## [1] "Inconclusivo: O pinguim 269 pode ser macho ou fêmea."
## [1] "O pinguim 9 é provavelmente uma fêmea."
## [1] "O pinguim 10 é provavelmente um macho."
## [1] "O pinguim 11 é provavelmente uma fêmea."
## [1] "Inconclusivo: O pinguim 12 pode ser macho ou fêmea."
## [1] "O pinguim 48 é provavelmente uma fêmea."
  • 1

    Thanks so much @Marcus Nunes! It worked great! And thanks also for editing my post. So, it taught me how to make a better post for the next. ;)

  • Problem-free : )

Browser other questions tagged

You are not signed in. Login or sign up in order to post.