Reputation: 117
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
Reputation: 388817
reactive
expression is broken and closes unexpectedly..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)
Upvotes: 1