You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 08:06:03