如何在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"))
期望得到的表格:
| var | Group 1 | Group 2 | ||
|---|---|---|---|---|
| n_group1 | mean_group1 | n_group2 | mean_group2 | |
| var1 | 10 (10.00%) | 20 (20.00%) | ||
| var4 | 10 (10.00%) | 20 (20.00%) | ||
| var3 | 1 ± 0.1 | 20 ± 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"))
得到的错误表格:
| var | Group 1 | Group 2 | ||
|---|---|---|---|---|
| n_group1 | mean_group1 | n_group2 | mean_group2 | |
| var1 | 10 | 20 | ||
| var4 | 10 | 20 | ||
| var3 | 1 ± 20 | 20 |
内容的提问来源于stack exchange,提问作者Stephane Tuffier
相关产品推荐
相关产品推荐

