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

