如何按行总和排序tbl_custom_summary输出?按频率排序因子
解决方案
1. 按频率排序因子变量
先在数据预处理阶段,用forcats包的函数按因子出现频率调整水平顺序,示例中期望的B、A、C顺序刚好对应频率从高到低:
library(tidyverse) library(gtsummary) # 构造高行数示例数据集 set.seed(123) df <- tibble( group = sample(c("Control", "Treatment"), 10000, replace = TRUE), factor_var = sample(c("A", "B", "C"), 10000, replace = TRUE, prob = c(0.3, 0.5, 0.2)) ) # 按频率从高到低自动设置因子水平(直接得到B、A、C顺序) df <- df %>% mutate(factor_var = fct_infreq(factor_var))
如果需要手动指定顺序,也可以用fct_relevel():
df <- df %>% mutate(factor_var = fct_relevel(factor_var, "B", "A", "C"))
2. 生成自定义汇总表并按行总和排序
用tbl_custom_summary生成表后,通过modify_table_body()操作底层数据框,按行的总样本量(分组后各水平的总和)排序:
# 生成带总列的自定义汇总表 custom_tbl <- df %>% tbl_custom_summary( by = group, include = factor_var, stat_fns = ~list( n = ~n(), pct = ~pct(digits = 1) ), stat_labels = list(n = "例数", pct = "百分比") ) %>% add_overall() # 添加总列用于计算行总和 # 按行总例数降序排序 sorted_tbl <- custom_tbl %>% modify_table_body( ~.x %>% # 从总列提取数字作为行总和(总列默认变量名为stat_0) mutate(total_n = parse_number(stat_0)) %>% arrange(desc(total_n)) %>% select(-total_n) # 移除临时计算列 ) # 输出排序后的表 sorted_tbl
简化方案:用tbl_summary实现
如果不需要高度自定义统计量,tbl_summary流程更简洁,同样支持需求:
summary_tbl <- df %>% mutate(factor_var = fct_infreq(factor_var)) %>% tbl_summary( by = group, include = factor_var, statistic = all_categorical() ~ "{n} ({p}%)" ) %>% add_overall() %>% modify_table_body( ~.x %>% mutate(total_n = parse_number(stat_0)) %>% arrange(desc(total_n)) %>% select(-total_n) )
内容的提问来源于stack exchange,提问作者mac389
相关产品推荐
相关产品推荐

