如何在tbl_summary()中设置变量层级分组并实现缩进显示?
在gtsummary里实现变量分组+层级缩进统计
一、gtsummary内置分组方案(优先用这个)
gtsummary本身就支持变量分组、整体统计展示和层级缩进,不用额外折腾数据预处理。拿预处理后的starwars数据集举例——假设我们把hair_color和skin_color归为「外观特征」组,height和mass归为「身体指标」组:
1. 先整理数据+定义分组映射
library(gtsummary) library(dplyr) # 筛选starwars里的有效数据 starwars_df <- starwars %>% select(name, hair_color, skin_color, height, mass, gender) %>% drop_na(hair_color, skin_color, height, mass) # 给变量分配分组 var_groups <- list( "外观特征" = c("hair_color", "skin_color"), "身体指标" = c("height", "mass") )
2. 生成带分组、整体统计和缩进的表格
用group=参数指定变量分组,add_overall()加整体统计列,最后用modify_table_styling()给单个变量行加缩进:
starwars_df %>% tbl_summary( by = gender, # 按性别分组统计 group = var_groups, # 应用我们定义的变量分组 statistic = list( all_categorical() ~ "{n} ({p}%)", all_continuous() ~ "{mean} ± {sd}" ) ) %>% add_overall(label = "整体") %>% # 添加上行的整体统计 modify_table_styling( columns = label, rows = !is_group_row(), # 只给非分组标题的行(单个变量)加缩进 text_format = function(x) paste0(" ", x) # 用两个空格实现层级缩进 ) %>% modify_header(label = "**变量分组/变量**")
这里的group=是gtsummary原生的分组功能,会自动把同组变量归在一起,再通过缩进区分分组标题和单个变量,层级感直接就出来了。
二、数据预处理实现(自定义复杂场景用)
如果需要更灵活的自定义(比如要同时展示分组的汇总统计和组内单个变量的统计,像你说的apple、banana单独展示,还要显示fruits分组的整体统计),可以通过数据重塑来实现:
1. 先模拟数据+生成分组汇总变量
先造一个带逻辑变量的数据集,比如模拟apple、banana和它们的分组fruits:
# 给starwars数据加水果相关逻辑变量 fruit_df <- starwars_df %>% mutate( apple = sample(c(TRUE, FALSE), nrow(.), replace = TRUE), banana = sample(c(TRUE, FALSE), nrow(.), replace = TRUE), fruits = apple | banana # fruits是apple和banana的整体分组 ) %>% select(gender, apple, banana, fruits)
2. 重塑数据+标记层级
把数据转成长格式,给单个变量加缩进标记,同时调整显示顺序让分组行在前:
fruit_long <- fruit_df %>% pivot_longer(cols = -gender, names_to = "variable", values_to = "value") %>% mutate( # 标记分组和单个变量 group_label = case_when( variable == "fruits" ~ "水果分组", TRUE ~ "单个水果" ), # 设定顺序:先显示分组,再显示单个变量 order = case_when( variable == "fruits" ~ 1, variable == "apple" ~ 2, variable == "banana" ~ 3 ) ) %>% arrange(order)
3. 生成表格+设置缩进样式
用tbl_summary()生成表格,再给单个变量行加缩进:
fruit_long %>% tbl_summary( by = gender, include = c(group_label, variable, value), statistic = all_logical() ~ "{n} ({p}%)", label = list(variable ~ "变量", group_label ~ "分组") ) %>% modify_table_styling( columns = label, rows = variable %in% c("apple", "banana"), text_format = function(x) paste0(" ", x) ) %>% modify_header(label = "**分组/变量**")
这种方法适合需要自定义分组汇总的场景,完全按你的需求来调整层级和统计内容。
额外提示
- 内置方案更省心,适合常规的变量分组展示;
- 如果需要更精细的缩进控制,可以把表格转成gt对象,用
gt::text_indent()函数调整; - 统计格式可以通过
statistic=参数自定义,比如调整百分比小数位、均值格式等。
内容的提问来源于stack exchange,提问作者GuedesBF
相关产品推荐
相关产品推荐

