在R中实现双因子分组的结构化gt表格构建技术问询
实现双因子分组的gt表格解决方案
你之前的问题出在数据透视的方向上——我们需要把age作为列的主分组维度,同时让Variable作为行的分组,sex作为每个分组下的子行。下面用gt包一步步实现你想要的格式:
第一步:整理数据结构
首先我们需要把age数值映射为你期望的分组名称(age_y/age_m/age_o),然后将数据转换为适合gt分组的宽格式:
library(tidyverse) library(gt) # 你的示例数据 data <- data.frame(ID=c("Mary","Mary","Mary","Jane","Jane","Jane","John","John","John"), sex=c("F","F","F","F","F","F","M","M","M"), age=c(1,1,1,3,3,3,2,2,2), Variable = c("VARIABLE 1", "VARIABLE 2", "VARIABLE 3"), Count = c(45, 76, 43), Percent = c(0.45, 0.56, 0.89)) # 处理数据:映射age分组名 + 转换宽格式 data_processed <- data %>% mutate(age_group = case_when( age == 1 ~ "age_y", age == 2 ~ "age_m", age == 3 ~ "age_o" )) %>% pivot_wider( id_cols = c(Variable, sex), names_from = age_group, values_from = c(Count, Percent), names_glue = "{age_group}_{.value}" ) %>% arrange(Variable)
第二步:用gt构建双分组表格
接下来我们用gt的分组功能,实现行按Variable分组、列按age分组的效果,同时优化表格样式:
final_table <- data_processed %>% # 将Variable设为行分组 gt(groupname_col = "Variable") %>% # 按下划线自动拆分列分组(age_y/age_m/age_o) tab_spanner_delim(delim = "_") %>% # 把百分比列格式化为带%的形式 fmt_percent(columns = contains("Percent"), decimals = 0) %>% # 重命名列,让表头更简洁 cols_label( sex = "", age_y_Count = "Count", age_y_Percent = "Percent", age_m_Count = "Count", age_m_Percent = "Percent", age_o_Count = "Count", age_o_Percent = "Percent" ) %>% # 美化分组标题样式 tab_style( style = cell_text(weight = "bold", size = 11), locations = cells_group() ) %>% # 加粗列分组标题 tab_style( style = cell_text(weight = "bold"), locations = cells_column_spanners() ) %>% # 添加行条纹,提升可读性 opt_row_striping() %>% # 给行分组添加边框,区分不同Variable tab_options( row_group.border.top = border(width = 1), row_group.border.bottom = border(width = 1) ) final_table
效果说明
这个表格会完全符合你的期望:
- 行:每个
VARIABLE作为一个独立分组,下面包含Male和Female的两行数据 - 列:每个
age分组(age_y/age_m/age_o)作为列组,每组下包含Count和Percent两个子列 - 百分比自动转换为XX%的格式,样式清晰易读
如果你想尝试kableExtra,也可以用group_rows()实现行分组,add_header_above()实现列分组,核心思路和上面的数据整理步骤一致。
内容的提问来源于stack exchange,提问作者Alycia Bisson
相关产品推荐
相关产品推荐

