You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R的gtsummary包中按列排序分组频率表行?

解决gtsummary按Overall或分组列排序行的方法

要实现按Overall列或分组列对变量行排序,不能直接用tbl_summary()的sort参数(该参数用于变量内部类别排序,而非变量行之间排序),也不建议直接转gt表操作,正确方法是用modify_table_body()修改表格主体数据,基于统计列的数值排序:

按Overall列排序

提取Overall列(stat_0)中的百分比数值,以此为依据排序:

library(gtsummary)
library(dplyr)
library(stringr)

some_made_up_data <- data.frame(Q1a=c(rep(c(1,0,1,1,0),20)),
                                Q1b=c(rep(c(1,1,1,1,0),20)),
                                Q1c=c(rep(c(1,0,0,0,1),20)),
                                group=c(rep(c("g1","g2","g3","g4","g5"),20)))

some_made_up_data %>%
  tbl_summary(include = starts_with("Q1"), by = group) %>%
  add_overall() %>%
  modify_table_body(
    ~ .x %>%
      # 提取Overall列的百分比数值
      mutate(overall_pct = as.numeric(str_extract(stat_0, "\\d+\\.?\\d*"))) %>%
      # 按百分比降序排序,升序则用arrange(overall_pct)
      arrange(desc(overall_pct)) %>%
      # 删除临时计算列
      select(-overall_pct)
  )

按指定分组列排序

如果要按某个分组(比如g1)的统计值排序,只需将stat_0替换为对应分组的统计列(分组列的统计列命名为stat_1、stat_2...,对应分组的顺序):

some_made_up_data %>%
  tbl_summary(include = starts_with("Q1"), by = group) %>%
  add_overall() %>%
  modify_table_body(
    ~ .x %>%
      # 提取g1分组列(stat_1)的百分比数值
      mutate(g1_pct = as.numeric(str_extract(stat_1, "\\d+\\.?\\d*"))) %>%
      arrange(desc(g1_pct)) %>%
      select(-g1_pct)
  )

关键说明

  • modify_table_body()是gtsummary专门用于修改表格底层数据的函数,通过操作表格主体的data.frame,可以灵活实现行排序、筛选等自定义操作。
  • 统计列(stat_0、stat_1等)存储的是带格式的字符串(如60 (60%)),需要用str_extract()提取数值部分才能用于排序。

内容的提问来源于stack exchange,提问作者Mauro r

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 02:55:16