使用R tidyverse以表内指定行数据为基准计算百分比的方法
R tidyverse 按指定规则计算百分比实现方案
核心思路是先提取两个计算所需的基准计数值,再按分类对应的规则分别计算占比即可,完整代码如下:
- 加载依赖包与构造示例数据
library(tidyverse) # 示例数据 df <- structure(list(Category = c("NSTEMI", "Seen by cardiologist", "Admitted to cardiac unit or Ward", "Eligible for angiography", "Underwent angiography", "Underwent angiography before discharge" ), Counts = c(196L, 196L, 158L, 174L, 174L, 173L)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
- 计算百分比
# 提取两个基准值 base_nstemi <- df %>% filter(Category == "NSTEMI") %>% pull(Counts) base_elig_angio <- df %>% filter(Category == "Eligible for angiography") %>% pull(Counts) # 按规则计算占比 df_result <- df %>% mutate( Percentage = case_when( # 第一行固定为100% Category == "NSTEMI" ~ 100, # 三个分类以NSTEMI计数为基数 Category %in% c("Seen by cardiologist", "Admitted to cardiac unit or Ward", "Eligible for angiography") ~ Counts / base_nstemi * 100, # 最后两个分类以符合血管造影指征的计数为基数 TRUE ~ Counts / base_elig_angio * 100 ), # 格式化输出为带百分号的样式,保留1位小数 Percentage = paste0(round(Percentage, 1), "%") )
- 输出结果示例
计算后的df_result内容如下:
| Category | Counts | Percentage |
|---|---|---|
| NSTEMI | 196 | 100% |
| Seen by cardiologist | 196 | 100% |
| Admitted to cardiac unit or Ward | 158 | 80.6% |
| Eligible for angiography | 174 | 88.8% |
| Underwent angiography | 174 | 100% |
| Underwent angiography before discharge | 173 | 99.4% |
如果需要生成和示例图样式一致的可视化表格,可以配合gt、flextable等表格美化包调整样式即可。
内容的提问来源于stack exchange,提问作者GaB
相关产品推荐
相关产品推荐

