Shiny应用存在多个众数时仅展示数值最大众数的代码调整问题
问题说明
我在下方代码中计算一周中部分日期(准确来说是周一和周日)的众数值,从生成的表格可以看到,周日仅有1个众数值,周一存在2个众数值。我希望做如下调整:每当出现2个众数值时,仅展示数值最大的那个,本示例中周一就仅展示数值6即可。
解决方案
你只需要调整自定义的众数计算函数,在筛选出所有频率最高的众数后,取数值最大的返回即可。
修改点
找到代码中定义众数计算函数的部分:
y <- function(x) { x <- table(as.vector(x)) names(x)[x == max(x)]}
修改为:
y <- function(x) { x <- table(as.vector(x)) # 筛选所有符合条件的众数 modes <- names(x)[x == max(x)] # 转换为数值取最大值后返回 as.character(max(as.numeric(modes))) }
完整可运行代码
library(shiny) library(shinythemes) library(dplyr) library(tools) library(DT) Test <- structure(list(date1 = as.Date(c("2021-11-01","2021-11-01","2021-11-01","2021-11-01","2021-11-01")), date2 = as.Date(c("2021-10-18","2021-10-18","2021-10-28","2021-10-30","2021-10-30")), Week = c("Monday", "Monday", "Sunday", "Sunday","Sunday"), Category = c("FDE", "FDE", "FDE", "FDE","FDE"), time = c(4, 6, 3, 2,3)), class = "data.frame",row.names = c(NA, -5L)) ui <- fluidPage( shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE, br(), tabPanel("", sidebarLayout( sidebarPanel( uiOutput('daterange') ), mainPanel( dataTableOutput('table') ) )) )) server <- function(input, output,session) { data <- reactive(Test) output$daterange <- renderUI({ dateRangeInput("daterange1", "Period you want to see:", min = min(data()$date1)) }) observe({updateDateRangeInput(session,"daterange1",start = NA, end = NA)}) wk_port2eng <- data.frame( WeekE = c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"), WeekP = c("segunda-feira", "terca-feira", "quarta-feira", "quinta-feira", "sexta-feira", "sabado", "domingo") ) data_subset <- reactive({ req(input$daterange1) req(input$daterange1[1] <= input$daterange1[2]) days <- seq(input$daterange1[1], input$daterange1[2], by = 'day') Test1 <- dplyr::filter(data(), date1 %in% days) weeks_inp <- unique(weekdays(days)) wk <- wk_port2eng[wk_port2eng$WeekP %in% weeks_inp,] ### if weekday is in Portuguese in your notebook #wk <- wk_port2eng[wk_port2eng$WeekE %in% weeks_inp,] ### if weekday is in English in your notebook weeks_ine <- wk$WeekE # 修改后的众数计算函数 y <- function(x) { x <- table(as.vector(x)) modes <- names(x)[x == max(x)] as.character(max(as.numeric(modes))) } mode<-data()%>% group_by(Week = tools::toTitleCase(Week)) %>% summarize(time=y(time),.groups = 'drop') mode <- mode[mode$Week %in% as.character(weeks_ine),] }) output$table <- renderDataTable({ data_subset() }) } shinyApp(ui = ui, server = server)
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

