如何用R的gt包调整tab_spanner层级并转换表格列分组
问题
当前代码生成的表格中,tab_spanner 以 statistic、p.value 作为一级标题,下属不同的item编号列。现在需要反转层级,以item编号作为一级标题,下属statistic和p.value列,同时调整tab_spanner的层级,请问该如何实现?
原代码如下:
library(tidyverse) library(tidyr) library(gt) # shapiro-wilk test results sw <- tibble( session = c(1, 1, 2, 2, 3, 3, 4, 4), item = c(1, 2, 1, 2, 1, 2, 1, 2), statistic = runif(8), p.value = runif(8) ) sw_w <- sw %>% pivot_wider(names_from = item, values_from = c(statistic, p.value)) gt_tbl1 <- gt(sw_w, rowname_col = "session") gt_tbl2 <- gt_tbl1 %>% # create column spanners as already indicated in the column names by "_" tab_spanner_delim(delim = "_") %>% # format percentage columns fmt_number(columns = 2:5, decimals = 3) gt_tbl2 %>% tab_options(container.height = px(500))
解决方案
核心思路是调整宽格式转换后的列名结构,让item编号作为列名前缀,指标(statistic/p.value)作为后缀,这样tab_spanner_delim就能自动识别层级关系。具体修改如下:
library(tidyverse) library(tidyr) library(gt) # shapiro-wilk test results sw <- tibble( session = c(1, 1, 2, 2, 3, 3, 4, 4), item = c(1, 2, 1, 2, 1, 2, 1, 2), statistic = runif(8), p.value = runif(8) ) # 调整宽格式转换逻辑:先将指标转成long格式,再以item+指标组合生成列名 sw_w <- sw %>% # 把statistic和p.value转为长格式,新增metric列存储指标名称 pivot_longer(cols = c(statistic, p.value), names_to = "metric") %>% # 转换为宽格式,用item和metric作为列名来源,指定列名格式为{item}_{metric} pivot_wider(names_from = c(item, metric), names_glue = "{item}_{metric}") gt_tbl1 <- gt(sw_w, rowname_col = "session") gt_tbl2 <- gt_tbl1 %>% # 按下划线分隔列名,自动生成以item编号为一级标题的分组 tab_spanner_delim(delim = "_") %>% # 格式化数值列,保留3位小数 fmt_number(columns = everything(), decimals = 3) gt_tbl2 %>% tab_options(container.height = px(500))
关键修改说明
调整宽格式转换:
- 先用
pivot_longer将statistic和p.value合并为一列(metric),把数据从宽转长,方便后续按item分组生成列名 - 再用
pivot_wider转换回宽格式,通过names_glue = "{item}_{metric}"指定列名结构为item编号_指标名称,确保item编号作为列名的第一部分
- 先用
层级自动识别:
tab_spanner_delim(delim = "_")会根据列名的下划线分隔符,自动将第一部分(item编号)作为一级标题,第二部分(statistic/p.value)作为下属列,实现层级反转的效果
内容的提问来源于stack exchange,提问作者sbac
相关产品推荐
相关产品推荐

