Home > Software design >  Grouping and Identifying the Maximum During a Simulation in R
Grouping and Identifying the Maximum During a Simulation in R

Time:04-28

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

CodePudding user response:

I think this should work:

library(dplyr)

Subjects <- c(1,2,3,4,5,6)
Group <- c('A','A','B','B','C','C')

Groups <- c('A','B','C')
Top_Group <- c(0,0,0)


x <- 10

for(i in 1:x) {
    Score <- rnorm(6,mean=5,sd=1)
    
    Example <- data.frame(Subjects,Group,Score)
    

    
    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)

    Top_Group <- Top_Group   Score_by_Group$Top_Group
}

tibble(Groups, Top_Group)

CodePudding user response:

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
  • Related