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

如何在R的gtsummary中对字符型分类变量进行自然排序?

问题:字符型类字母数字变量在gtsummary中的自定义排序

需要将grade变量的等级按1、2、10的顺序排列,已知转为数字类型可解决,但实际场景必须保留字符类型。尝试了gtsummary手册中的sort = list(grade ~ "alphanumeric")设置,仍未得到预期结果,相关代码如下:

library(gtsummary)
trial2 <- trial %>% 
    dplyr::select(trt, age, grade) %>%
mutate(grade = case_when(grade == "I" ~ "1",
                         grade == "II" ~ "10",
                         TRUE ~ "2"))

trial2 %>%
    tbl_summary(by = trt,
                sort = list(
                           grade ~ "alphanumeric")) %>%
    add_p() %>%
    modify_footnote(update = everything() ~ NA) %>%
     bold_labels()

解决方案

方法1:转为有序因子(推荐)

gtsummary会尊重因子的水平顺序,同时保留字符的显示形式,是最稳妥的方式:

library(gtsummary)
library(dplyr)

trial2 <- trial %>% 
  select(trt, age, grade) %>%
  mutate(
    grade = case_when(
      grade == "I" ~ "1",
      grade == "II" ~ "10",
      TRUE ~ "2"
    ),
    # 直接指定想要的排序顺序
    grade = factor(grade, levels = c("1", "2", "10"), ordered = TRUE)
  )

trial2 %>%
  tbl_summary(by = trt) %>% # 无需额外sort参数,因子顺序自动生效
  add_p() %>%
  modify_footnote(update = everything() ~ NA) %>%
  bold_labels()

方法2:自定义sort排序函数

如果不想转换变量类型,可以给sort参数传入一个基于数值转换的排序函数:

library(gtsummary)
library(dplyr)

trial2 <- trial %>% 
  select(trt, age, grade) %>%
  mutate(
    grade = case_when(
      grade == "I" ~ "1",
      grade == "II" ~ "10",
      TRUE ~ "2"
    )
  )

trial2 %>%
  tbl_summary(
    by = trt,
    sort = list(grade ~ function(x) order(as.numeric(x)))
  ) %>%
  add_p() %>%
  modify_footnote(update = everything() ~ NA) %>%
  bold_labels()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:15:48