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

如何为tbl_summary汇总表添加总数据集占比行

问题

我正在为数据框data2创建汇总表,按Group列分组汇总,使用的代码如下:

data2 %>% 
  tbl_summary(by=Group)

data2是data1的子集,我希望在汇总表中添加一行“% of total”,展示每个分组占完整数据集data1的百分比,计算公式为:

GroupA <- (sum(data2$Group == "GroupA")/nrow(data1))*100
GroupB <- (sum(data2$Group == "GroupB")/nrow(data1))*100
GroupC <- (sum(data2$Group == "GroupC")/nrow(data1))*100
GroupD <- (sum(data2$Group == "GroupD")/nrow(data1))*100

当前汇总表包含Age、Female特征的分组统计,我尝试过add_stat函数,但它仅能添加列而非行,请问该如何实现?

附样本数据:

# A tibble: 15 × 3
   Group  Female   Age
   <chr>  <lgl>  <dbl>
 1 GroupC TRUE      97
 2 GroupD FALSE     96
 3 GroupD TRUE      74
 4 GroupA TRUE     102
 5 GroupA FALSE     68
 6 GroupB FALSE     92
 7 GroupA FALSE    100
 8 GroupD TRUE      89
 9 GroupB TRUE     102
10 GroupB FALSE     92
11 GroupA TRUE      85
12 GroupD TRUE      64
13 GroupC FALSE     89
14 GroupB TRUE      84
15 GroupC FALSE     88

解决方案

可以利用gtsummary包的modify_table_body函数手动添加目标行,具体实现如下:

方法1:先计算占比再合并到表中

library(gtsummary)
library(dplyr)

# 计算各分组占data1的百分比,整理成符合表格结构的数据框
group_pct <- tibble(
  variable = "% of total",
  var_type = "categorical",
  row_type = "label",
  GroupA = (sum(data2$Group == "GroupA")/nrow(data1))*100,
  GroupB = (sum(data2$Group == "GroupB")/nrow(data1))*100,
  GroupC = (sum(data2$Group == "GroupC")/nrow(data1))*100,
  GroupD = (sum(data2$Group == "GroupD")/nrow(data1))*100
)

# 生成原始汇总表并添加占比行
data2 %>% 
  tbl_summary(by = Group) %>%
  modify_table_body(~ bind_rows(., group_pct)) %>%
  # 格式化百分比列,保留1位小数
  modify_fmt_fun(
    columns = starts_with("Group"),
    rows = variable == "% of total",
    fmt_fun = ~ style_percent(.x/100, digits = 1)
  )

方法2:直接在表格修改步骤中计算占比

如果不想单独生成占比数据框,可以直接在modify_table_body中完成计算:

library(gtsummary)
library(dplyr)

data2 %>% 
  tbl_summary(by = Group) %>%
  modify_table_body(
    ~ bind_rows(
      .,
      tibble(
        variable = "% of total",
        var_type = "categorical",
        row_type = "label",
        GroupA = (sum(data2$Group == "GroupA")/nrow(data1))*100,
        GroupB = (sum(data2$Group == "GroupB")/nrow(data1))*100,
        GroupC = (sum(data2$Group == "GroupC")/nrow(data1))*100,
        GroupD = (sum(data2$Group == "GroupD")/nrow(data1))*100
      )
    )
  ) %>%
  modify_fmt_fun(
    columns = starts_with("Group"),
    rows = variable == "% of total",
    fmt_fun = ~ style_percent(.x/100, digits = 1)
  )

两种方法都能在汇总表末尾添加一行“% of total”,展示各分组相对于完整数据集data1的占比。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:08:27