如何在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
相关产品推荐
相关产品推荐

