如何使用gt包将汇总表的行分组转换为列展示?
解决方法
要实现把时间点从行转成列的双层表头结构,核心是先把数据从长格式转成宽格式,再用gt的表头分组功能完成布局。
步骤1:数据重塑(长转宽)
合并H_LG3和W_LG3后,用tidyr::pivot_wider将time维度转成列前缀,把estimate_ci和p_val两个指标展开到对应时间点下:
library(tidyr) library(gt) # 合并数据并重塑格式 combined_data <- rbind(H_LG3, W_LG3) %>% pivot_wider( id_cols = c(case_control, label), # 保留行维度的关键列 names_from = time, # 将时间点转为列名前缀 values_from = c(estimate_ci, p_val), # 要展开的指标列 names_sep = "_" # 列名分隔符,生成如estimate_ci_时间点1的列名 )
步骤2:用gt构建目标表格
基于重塑后的宽格式数据,用gt的tab_spanner创建时间点分组表头,同时保留原有的行分组、格式设置:
combined_data %>% gt() %>% # 设置指标列的数字格式 fmt_number( columns = starts_with(c("estimate_ci", "p_val")), decimals = 3 ) %>% # 添加原有的行分组标签 tab_row_group(group = md('**H**'), rows = 1:nrow(H_LG3)) %>% tab_row_group(group = md('**W**'), rows = (nrow(H_LG3) + 1):nrow(combined_data)) %>% # 创建时间点分组的上层表头 tab_spanner( label = md("**时间点1**"), columns = ends_with("_时间点1") # 匹配对应时间点的所有列 ) %>% tab_spanner( label = md("**时间点2**"), columns = ends_with("_时间点2") ) %>% # 设置底层列的显示标签 cols_label( case_control = md("**标签**"), estimate_ci_时间点1 = md("**Estimate(CI)**"), p_val_时间点1 = md("**P Value**"), estimate_ci_时间点2 = md("**Estimate(CI)**"), p_val_时间点2 = md("**P Value**") ) %>% # 不需要label列时可以隐藏 cols_hide(columns = label) %>% tab_header(md("**Table 4**"))
关键说明
pivot_wider是行转列的核心,需确保id_cols包含所有需要保留为行维度的变量(比如这里的case_control)。tab_spanner用于将同一时间点下的指标列合并到统一表头下,实现双层表头效果,若你的时间点命名不同,只需修改ends_with里的匹配内容即可。
内容的提问来源于stack exchange,提问作者Kelly
相关产品推荐
相关产品推荐

