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

如何在R的table1包中显示行百分比(患病率)而非列百分比?

1. 在table1包中实现行百分比

可以实现,但需要自定义render.categorical函数——因为table1默认的百分比计算基于分层组(列)的总数,要得到行百分比,得先获取每个人口学变量类别的行总频数,再用组内频数除以行总数计算占比。

示例代码:

# 预处理:计算每个人口学变量类别的总人数(用于行百分比计算)
row_totals <- list(
  SEXBIRTH = table(mydata$SEXBIRTH),
  RACE_1 = table(mydata$RACE_1)
)

# 自定义行百分比渲染函数
render_row_pct <- function(x, name, ...) {
  # 获取当前变量类别的行总数
  total <- row_totals[[name]][as.character(x$value)]
  # 计算频数和行百分比(排除NA)
  freq <- sum(!is.na(x$value))
  pct <- ifelse(total > 0, round(freq/total*100, 1), 0)
  paste0(freq, " (", pct, "%)")
}

# 调用table1生成行百分比表格
table1(~ 
         SEXBIRTH + RACE_1 + AGEATVIS | factor(HIVPOS),
       data = mydata,
       render.categorical = render_row_pct, 
       render.continuous = "Mean (SD)",
       overall = FALSE
)

注意:若人口学变量较多,需将所有变量加入row_totals列表;连续变量无需修改render.continuous参数。


2. 替代包与实现方法

如果觉得table1的自定义逻辑繁琐,推荐以下两种更直观的方案:

方案1:gtsummary包

你之前尝试未成功,大概率是没用到modify_table_body调整百分比计算逻辑。核心是先构建基础分层表,再替换列百分比为行百分比:

library(gtsummary)

# 生成基础分层表
tbl <- tbl_summary(
  data = mydata,
  by = HIVPOS,
  include = c(SEXBIRTH, RACE_1, AGEATVIS),
  statistic = list(
    all_categorical() ~ "{n} ({p}%)",
    all_continuous() ~ "{mean} ({sd})"
  ),
  missing = "no"
)

# 修改为行百分比并美化格式
tbl %>%
  modify_table_body(
    ~ .x %>%
      group_by(variable, label) %>%
      mutate(
        row_total = sum(n, na.rm = TRUE),
        p = round(n/row_total*100, 1)
      ) %>%
      ungroup()
  ) %>%
  modify_header(stat_by = "**HIV {level}**") %>%
  bold_labels()

方案2:janitor + flextable包

janitor的tabyl函数可快速生成交叉表,配合adorn_percentages指定行百分比,最后用flextable美化输出:

library(janitor)
library(flextable)
library(dplyr)

# 单变量行百分比表(以SEXBIRTH为例)
sex_table <- mydata %>%
  tabyl(SEXBIRTH, HIVPOS) %>%
  adorn_percentages("row") %>%
  adorn_pct_formatting(digits = 1) %>%
  adorn_ns(position = "front") %>%
  rename(Variable = SEXBIRTH)

# 美化表格并调整表头
flextable(sex_table) %>%
  set_header_labels(`0` = "HIV阴性", `1` = "HIV阳性") %>%
  autofit()

# 多变量可通过purrr批量生成后合并

3. 自定义修改与工作流注意事项

  • 缺失值处理:提前用filter(!is.na(HIVPOS))过滤无效数据,或在渲染函数中排除NA,避免百分比计算偏差;
  • 百分比精度:根据需求调整小数位数(如round(..., 1)或adorn_pct_formatting(digits = 0));
  • 格式对齐:输出HTML/PDF时,可通过包自带工具调整列对齐(如table1的css参数、gtsummary的modify_table_styling);
  • 正确性验证:手动抽查行百分比之和是否为100%,确保计算逻辑无误;
  • 批量处理:变量较多时,用循环或purrr批量生成表格再合并,减少重复代码;
  • 导出适配:若需导出Word/PDF,gtsummary和flextable支持直接导出(如gtsave()或save_as_docx())。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:39:51