如何在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的分组操作即可实现,核心是分组后提取每组的两个数值代入公式计算,具体步骤如下:
分组计算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.0860Shiny应用集成
将计算逻辑封装为函数,结合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
相关产品推荐
相关产品推荐

