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

