基于Rmarkdown/Quarto的试验事件统计表格生成问题
解决思路:dplyr整理统计数据 + gt生成报告表格
先模拟你的重复ID事件数据集(替换成你的真实数据即可):
library(dplyr) library(gt) # 最小示例数据集 event_data <- tibble( ID = c(1,1,2,3,3,3,4,5), type = c("A","B","A","A","B","C","B","A") )
1. 计算统计指标(整体+分类)
核心是先获取总唯一人员数,再分别统计整体和各类型的事件数、涉事唯一ID数,最后计算占比:
# 先获取总唯一人员数(用于计算占比) total_unique_ids <- event_data %>% distinct(ID) %>% nrow() # 整体事件统计 overall <- tibble( 事件类型 = "整体", 事件总数 = nrow(event_data), 涉事人员数 = total_unique_ids, 人员占比 = paste0(round(total_unique_ids / total_unique_ids * 100, 1), "%") ) # 按type分类统计 type_stats <- event_data %>% group_by(type) %>% summarize( 事件总数 = n(), 涉事人员数 = n_distinct(ID), # 统计唯一涉事ID,避免重复计数 .groups = "drop" ) %>% mutate( 事件类型 = type, 人员占比 = paste0(round(涉事人员数 / total_unique_ids * 100, 1), "%") ) %>% select(-type) # 合并整体与分类数据 summary_table_data <- bind_rows(overall, type_stats)
2. 生成适合报告的表格
用gt包把统计数据转换成专业表格,可直接在Rmarkdown/Quarto中渲染:
summary_table_data %>% gt() %>% tab_header(title = "事件统计汇总") %>% cols_label( 事件类型 = "事件类型", 事件总数 = "事件发生总数", 涉事人员数 = "涉及人员数量", 人员占比 = "人员占比" ) %>% fmt_number(columns = c(事件总数, 涉事人员数), decimals = 0) %>% tab_style( style = cell_text(weight = "bold"), locations = cells_body(rows = 事件类型 == "整体") )
关键说明
n_distinct(ID)专门统计唯一涉事人员,解决同一ID多条事件记录的重复计数问题- 单独计算整体统计后合并,确保表格包含你需要的"整体"汇总行
- gt包支持自定义样式(比如添加边框、调整配色等),完全适配研究报告的排版需求
内容的提问来源于stack exchange,提问作者ATram
相关产品推荐
相关产品推荐

