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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:05:19