RMarkdown中gtsummary按Overall列降序排序失效问题
解决gtsummary在RMarkdown中排序失效的问题
问题重现
数据集结构:
data <- data.frame( anoobito = sample(2019:2023), NOME_MUNICIPIO = sample(c("Rio de Janeiro", "São Paulo", "Araruama", "Queimados"), 230, replace = TRUE) )
在RStudio中,以下代码可按Overall列降序排序,但在RMarkdown中失效:
data %>% select(anoobito, NOME_MUNICIPIO) %>% tbl_summary(by = anoobito, label = c(NOME_MUNICIPIO ~ "")) %>% add_overall(last = T) %>% modify_table_body(fun = ~ dplyr::arrange(., desc(readr::parse_number(stat_0)))) %>% modify_spanning_header(c("stat_1":"stat_5") ~ "**Ano do Óbito**") %>% modify_header(label = 'Município de Residência') %>% bold_labels()
可能的原因及解决方案
1. 确保排序依据列的数值类型稳定
RMarkdown环境中,stat_0(Overall列)可能因渲染格式(如千位分隔符)导致readr::parse_number处理不稳定。可以先显式转换为数值型再排序:
data %>% select(anoobito, NOME_MUNICIPIO) %>% tbl_summary(by = anoobito, label = c(NOME_MUNICIPIO ~ "")) %>% add_overall(last = TRUE) %>% modify_table_body( fun = ~ . %>% mutate(overall_value = readr::parse_number(stat_0)) %>% arrange(desc(overall_value)) %>% select(-overall_value) ) %>% modify_spanning_header(c("stat_1":"stat_5") ~ "**Ano do Óbito**") %>% modify_header(label = 'Município de Residência') %>% bold_labels()
2. 避免后续操作覆盖排序
确保modify_table_body的排序操作在add_overall之后、其他表格样式修改之前执行,防止后续步骤意外打乱顺序。
3. 排除因子变量干扰
如果NOME_MUNICIPIO是因子类型,RMarkdown默认环境可能保留因子原始顺序,覆盖手动排序。先将其转为字符型:
data %>% mutate(NOME_MUNICIPIO = as.character(NOME_MUNICIPIO)) %>% select(anoobito, NOME_MUNICIPIO) %>% tbl_summary(by = anoobito, label = c(NOME_MUNICIPIO ~ "")) %>% add_overall(last = TRUE) %>% modify_table_body(fun = ~ dplyr::arrange(., desc(readr::parse_number(stat_0)))) %>% modify_spanning_header(c("stat_1":"stat_5") ~ "**Ano do Óbito**") %>% modify_header(label = 'Município de Residência') %>% bold_labels()
4. 强制锁定行顺序
若上述方法无效,可通过slice手动锁定排序后的行索引:
data %>% select(anoobito, NOME_MUNICIPIO) %>% tbl_summary(by = anoobito, label = c(NOME_MUNICIPIO ~ "")) %>% add_overall(last = TRUE) %>% modify_table_body( fun = ~ { sorted_df <- arrange(., desc(readr::parse_number(stat_0))) slice(sorted_df, 1:nrow(sorted_df)) } ) %>% modify_spanning_header(c("stat_1":"stat_5") ~ "**Ano do Óbito**") %>% modify_header(label = 'Município de Residência') %>% bold_labels()
内容的提问来源于stack exchange,提问作者Lana Meijinhos
相关产品推荐
相关产品推荐

