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

Shiny中按Especialidad分组统计指定范围数据占比的实现问题

问题分析

原有代码存在多个明显错误,导致无法实现预期效果:

  • 变量名、字段名混乱:混用BD9.4/BDa4、Especialidad/specialty.name,未定义的Cumplimiento字段直接使用
  • 区间判断逻辑错误:多次replace操作逻辑冲突,根本无法正确判断数值是否在选中区间内
  • 依赖关系处理错误:minn/maxx是renderUI内的局部变量,响应式函数BD9.5中无法直接访问
  • 循环计算占比效率极低:数据量大时性能卡顿,完全可以用分组统计函数替代

可行实现方案

依赖dplyr包实现简洁高效的统计逻辑,适合大数据量场景:

# 提前加载依赖
library(shiny)
library(dplyr)

# 原有动态生成slider的逻辑保留即可,无需修改
output$Rango<-renderUI({
   req(input$SeleccioneIndice)
   minn <- min(BD9.3()[,input$SeleccioneIndice], na.rm = TRUE)
   maxx <- max(BD9.3()[,input$SeleccioneIndice], na.rm = TRUE)
   sliderInput("Rango",label = "Seleccione un rango", min = minn, 
   max=maxx, value=c(minn,maxx))
})

# 重写统计逻辑
BD9.5 <- reactive({
  # 声明必填依赖,避免加载时报错
  req(input$SeleccioneIndice, input$Rango)
  df <- BD9.3()
  # 取选中区间上下限
  range_low <- input$Rango[1]
  range_high <- input$Rango[2]

  # 区间打标+统计
  stat_df <- df %>%
    # 不需要过滤空值可删掉此行
    filter(!is.na(Especialidad), !is.na(.data[[input$SeleccioneIndice]])) %>%
    # 一步判断是否在区间内
    mutate(Intervalo = if_else(
      .data[[input$SeleccioneIndice]] >= range_low & .data[[input$SeleccioneIndice]] <= range_high,
      "Correcto", "Fallo"
    )) %>%
    # 按分组统计次数、占比
    group_by(Especialidad, Intervalo) %>%
    summarise(Total = n(), .groups = "drop_last") %>%
    mutate(Porcentaje = round(Total / sum(Total) * 100, 2)) %>%
    ungroup() %>%
    arrange(Especialidad, Intervalo)
  
  return(stat_df)
})

# 输出统计结果
output$summary9 <- renderPrint({
  res <- BD9.5()
  # 只显示符合区间的统计就保留下面的过滤,要显示所有结果就删掉
  res <- res %>% filter(Intervalo == "Correcto") %>% arrange(desc(Porcentaje))
  print(res)
})

补充提示:你给出的示例数据集代码里有几个拼写错误:dataframe应改为data.frame,数字06、032应改为0.6、0.32,另外定义的列名有Indicea、Indiced,但创建数据集时写了Indiceb、Indicec,运行前要先修正这些问题避免报错。


内容的提问来源于stack exchange,提问作者ErikaC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 19:39:00