excelater
excelater

Reputation: 117

How do you do a group_by to grouped data inside a reactive function?

I want to group data so I can calculated the percentage of a group like shown below, but when I try to do it inside a reactive function for my shiny app I get an error for not being able to group a function. Is there another way to calculate the sum of the total group and create a column? -Edited code below is correct as well.

library(flexdashboard)
library(dplyr)
library(shiny)
library(plotly)


gender<-c("Male","Female","Female","Female","Male","Male","Male","Male","Female","Female")
age<-c(18,19,18,20,21,19,21,20,21,18)
sport<-c("Basketball","Basketball","Baseball/Softball","Basketball","Soccer","Baseball/Softball","Basketball","Soccer","Soccer","Soccer")
starter<-c("Yes","No","Yes","Yes","Yes","No","Yes","Yes","No","No")


data<-data.frame(gender,sport,starter)

datagr <- data %>%
  group_by(gender,age,sport,starter) %>%
  dplyr::summarise(n=n(), .groups="drop") %>%
  group_by(sport)%>%
  mutate(groupcount=sum(n)) %>%
  mutate(pog=paste0(round(100*n/groupcount,2),'%'))

datagr

Output

  gender sport             starter     n groupcount pog  
  <chr>  <chr>             <chr>   <int>      <int> <chr>
1 Female Baseball/Softball Yes         1          2 50%  
2 Female Basketball        No          1          4 25%  
3 Female Basketball        Yes         1          4 25%  
4 Female Soccer            No          2          4 50%  
5 Male   Baseball/Softball No          1          2 50%  
6 Male   Basketball        Yes         2          4 50%  
7 Male   Soccer            Yes         2          4 50%  
     

This code works now.

library(flexdashboard)
library(dplyr)
library(shiny)
library(plotly)


gender<-c("Male","Female","Female","Female","Male","Male","Male","Male","Female","Female")
age<-c("18","19","18","20","21","19","21","20","21","18")
sport<-c("Basketball","Basketball","Baseball/Softball","Basketball","Soccer","Baseball/Softball","Basketball","Soccer","Soccer","Soccer")
starter<-c("Yes","No","Yes","Yes","Yes","No","Yes","Yes","No","No")


data<-data.frame(gender,age, sport,starter)


cat.Variables <- c('gender', 'age')



ui <- fluidPage(
  
  sidebarPanel(
    selectInput('catgroup', choices = cat.Variables, label = 'Select filter options:'), 
    conditionalPanel(condition = "input.catgroup != '-'",
                     uiOutput("select_catgroup")
                    )
  ),
  mainPanel(plotlyOutput("myplot"))
  
)


server <- function(input, output) {
  

    
    
    datagr <- reactive({
      
      data %>% 
        group_by(data[[input$catgroup]], sport,starter) %>%
        summarize(n = n(), .groups="drop")  %>%
        group_by(sport)%>%
        mutate(groupcount=sum(n)) %>%
        mutate(pog=paste0(round(100*n/groupcount,2),'%')) })
    
        
    
    output$myplot <-  renderPlotly({
      datagrt <- datagr()
      colnames(datagrt) <- c("catgroup","sport","starter","n","groupcount","pog")
      plot_ly(datagrt, x = ~sport, y = ~n, type = "bar", color=~catgroup,  colors="Dark2") %>%
        layout(barmode = 'group')
    })
    
    
    
  
  
  
}

shinyApp(ui, server)  

   
    

Upvotes: 0

Views: 557

Answers (1)

Ronak Shah
Ronak Shah

Reputation: 388817

  • reactive expression is broken and closes unexpectedly.
  • Use .data[[input$catgroup]]
  • group_by(..) %>% summarise(n = n()) can be changed to count.
library(dplyr)
library(shiny)
library(plotly)

ui <- fluidPage(
  
  sidebarPanel(
    selectInput('catgroup', choices = cat.Variables, label = 'Select filter options:'), 
    #conditionalPanel(condition = "input.catgroup != '-'",
    uiOutput("select_catgroup")
    #)
  ),
  mainPanel(plotlyOutput("myplot"))
  
)


server <- function(input, output) {
  
  
  datagr <- reactive({
    
    data %>% 
      count(.data[[input$catgroup]], sport,starter) %>%
      group_by(sport)%>%
      mutate(groupcount=sum(n),
             pog=paste0(round(100*n/groupcount,2),'%'))
  })
  
  
  
  output$myplot <-  renderPlotly({
    datagrt <- datagr()
    colnames(datagrt) <- c("catgroup","sport","starter","n")
    plot_ly(datagrt, x = ~sport, y = ~n, type = "bar", color=~catgroup,  colors="Dark2") %>%
      layout(barmode = 'group')
  })
  
}

shinyApp(ui, server)

enter image description here

Upvotes: 1

Related Questions