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

如何在gt表格中批量合并各分组列(避免重复代码)

批量处理gt表格的cols_merge与分组表头需求

我需要在gt表格中重复应用cols_merge系列函数,数据为多变量多分组的统计汇总结果,数据框列名以stat_group格式命名。由于分组和统计量较多,且后续可能需要排除部分分组,不想手动重复编写cols_merge代码。

尝试过多种方法但效果均不理想:

  • 无法合并gt表格,无法为每个分组单独创建gt表格后合并;
  • cols_merge系列函数无法识别已有的表格spanner;
  • 在gt对象中无法使用mutate(across())。

理想状态下,希望使用map或类似across的方式,为每个分组自动创建spanner并合并列,示例函数如下:

function(gt, group){ 
    gt %>% 
    tab_spanner(columns = contains(group)) %>% 
    cols_merge_n_pct( col_n = contains(paste0("n_",group)),col_pct = contains(paste0("prop_",group))) 
}

手动实现的示例代码及期望结果

library(tidyverse)
library(gt)

# 示例数据
data <- tibble( "var" = c("var1", "var4", "var3"), 
                "n_group1" = c("10", "10", NA),
                "prop_group1" = c(0.1, 0.1, NA),
                "mean_group1" = c(NA,NA, "1"),
                "sd_group1" = c(NA, NA, "0.1"),
                "n_group2" = c("20", "20", NA),
                "prop_group2" = c(0.2, 0.2, NA),
                "mean_group2" = c(NA, NA, "20"),
                "sd_group2" = c(NA, NA, "0.2"))

data %>%
  gt() %>% 
  fmt_percent(
    columns = starts_with("prop_")
  ) %>% 
  sub_missing(missing_text = "") %>% 
  # 分组1表头
  tab_spanner(label = "Group 1", 
              columns = contains("group1")
  ) %>% 
  # 分组2表头
  tab_spanner(label = "Group 2", 
              columns = contains("group2")
  ) %>% 
  
  # 分组1统计量合并
  cols_merge_n_pct( col_n = "n_group1",col_pct = "prop_group1") %>% 
  cols_merge_uncert(col_val = "mean_group1", col_uncert = "sd_group1") %>% 
  cols_merge(columns = c("n_group1", "mean_group1")) %>% 
  # 分组2统计量合并
  cols_merge_n_pct( col_n = "n_group2",col_pct = "prop_group2") %>% 
  cols_merge_uncert(col_val = "mean_group2", col_uncert = "sd_group2") %>% 
  cols_merge(columns = c("n_group2", "mean_group2"))

期望得到的表格:

varGroup 1Group 2
n_group1mean_group1n_group2mean_group2
var110 (10.00%)20 (20.00%)
var410 (10.00%)20 (20.00%)
var31 ± 0.120 ± 0.2

批量尝试失败的代码及结果

# 无效代码
data %>%
  gt() %>% 
  fmt_percent(
    columns = starts_with("prop_")
  ) %>% 
  sub_missing(missing_text = "") %>% 
  # 分组1表头
  tab_spanner(label = "Group 1", 
              columns = contains("group1")
  ) %>% 
  # 分组2表头(理想状态下不想手动指定列)
  tab_spanner(label = "Group 2", 
              columns = contains("group2")
  ) %>% 
  cols_merge_n_pct( col_n = contains("n_group"),col_pct = contains("prop_group")) %>% 
  cols_merge_uncert(col_val = contains("mean_group"), col_uncert = contains("sd_group")) %>% 
  cols_merge(columns = matches("n_group|mean_group"))

得到的错误表格:

varGroup 1Group 2
n_group1mean_group1n_group2mean_group2
var11020
var41020
var31 ± 2020

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:27:13