Search code examples
rfor-loopgroup-bysimulation

Grouping and Identifying the Maximum During a Simulation in R


I am trying to do some simulations in R and I am stuck on the loop that I need to be doing. I am able to get what I need in one iteration but trying to code the loop is throwing me off. This is what i am doing for one iteration.

    Subjects <- c(1,2,3,4,5,6)
    Group <- c('A','A','B','B','C','C')
    Score <- rnorm(6,mean=5,sd=1)
    
    Example <- data.frame(Subjects,Group,Score)
    
    library(dplyr)
    
    Score_by_Group <- Example %>% group_by(Group) %>% summarise(SumGroup = sum(Score))
    Score_by_Group$Top_Group <- ifelse(Score_by_Group[,2] == max(Score_by_Group[,2]),1,0)

Group     SumGroup    Top_Group      
1 A         8.77          0
2 B         6.22          0
3 C         9.38          1

What I need my loop to do is, run the above 'X' times and every time that group has the Top Score, add it to the previous result. So for example, if the loop was to be x=10, I would need a result like this:

Group    Top_Group      
1 A          3
2 B          5
3 C          2

Solution

  • If you don't mind forgoing the for loop, we can use replicate to repeat the code, then bind the output together, and then summarize.

    library(tidyverse)
    
    run_sim <- function()
    {
      Subjects <- c(1, 2, 3, 4, 5, 6)
      Group <- c('A', 'A', 'B', 'B', 'C', 'C')
      Score <- rnorm(6, mean = 5, sd = 1)
    
      Example <- data.frame(Subjects, Group, Score)
    
      Score_by_Group <- Example %>%
        group_by(Group) %>%
        summarise(SumGroup = sum(Score)) %>%
        mutate(Top_Group = +(SumGroup == max(SumGroup))) %>%
        select(-SumGroup)
    }
    
    
    results <- bind_rows(replicate(10, run_sim(), simplify = F)) %>%
      group_by(Group) %>% 
      summarise(Top_Group = sum(Top_Group))
    

    Output

      Group Top_Group
      <chr>     <int>
    1 A             3
    2 B             3
    3 C             4