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

如何在Shiny中动态计算同ID样本的相对百分比差异(RPD)

在Shiny应用中批量计算分组样本的相对百分比差异(RPD)

需求说明

需根据公式 RPD = |a-b|/((a+b)/2),对具有相同样本ID的两组数值计算相对百分比差异,且样本ID的数量、分组会动态变化,要在Shiny应用中实现该功能。

示例数据:

IDs <- c("A", "A", "B", "B", "C", "C")
values <- c(1.2, 1.36, 2.87, 3, 2.54, 2.33)

df <- tibble(IDs, values)

解决方案

用dplyr的分组操作即可实现,核心是分组后提取每组的两个数值代入公式计算,具体步骤如下:

  1. 分组计算RPD
    通过group_by(IDs)分组后,在summarise中提取每组的首尾值(或指定位置的两个值)完成计算:

    library(dplyr)
    library(tibble)
    
    calculate_rpd <- function(df) {
      df %>%
        group_by(IDs) %>%
        summarise(
          RPD = abs(first(values) - last(values)) / ((first(values) + last(values)) / 2),
          .groups = "drop" # 取消分组状态,避免后续操作触发分组相关警告
        )
    }
    
    # 测试示例数据
    result <- calculate_rpd(df)
    print(result)
    

    输出结果:

    # A tibble: 3 × 2
      IDs     RPD
      <chr> <dbl>
    1 A     0.121
    2 B     0.0447
    3 C     0.0860
    
  2. Shiny应用集成
    将计算逻辑封装为函数,结合Shiny的输入输出模块,处理用户上传的动态数据:

    library(shiny)
    
    ui <- fluidPage(
      fileInput("data_file", "上传CSV数据文件"),
      tableOutput("rpd_result")
    )
    
    server <- function(input, output) {
      output$rpd_result <- renderTable({
        req(input$data_file)
        df <- read.csv(input$data_file$datapath)
        calculate_rpd(df)
      })
    }
    
    shinyApp(ui, server)
    

注意事项

  • 确保每个样本ID恰好对应两个数值,若存在多组或单组的情况,可提前添加过滤逻辑:
    df %>%
      group_by(IDs) %>%
      filter(n() == 2) %>% # 仅保留包含两个数值的分组
      summarise(
        RPD = abs(first(values) - last(values)) / ((first(values) + last(values)) / 2),
        .groups = "drop"
      )
    
  • 除了first()和last(),也可使用nth(values,1)和nth(values,2)明确指定提取分组内的第1、第2个值,效果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:50:11