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

gtsummary中tbl_cross表格百分比求和异常问题求助

解决gtsummary::tbl_cross小样本百分比求和异常与精细数字格式控制

你遇到的问题是小样本下tbl_cross的百分比四舍五入误差累积导致求和不符,直接用digits=1又会统一修改所有数字格式。可以通过自定义动态数字格式函数来解决,根据样本量自动调整有效数字位数,既保证求和准确,又兼顾不同数据集的显示需求。

方法1:自定义digits函数(单次生效)

写一个函数,根据当前分组的样本量动态决定小数位数——比如小样本(<50)保留1位小数,大样本保留0位。这个函数可以通过tbl_cross的digits参数传入:

library(gtsummary)
library(dplyr)

# 自定义动态数字格式函数
custom_digits <- function(x, context) {
  # 获取当前行的总样本量
  row_total <- context$df %>%
    filter(.data[[context$row_var]] == context$row_val) %>%
    pull(.data[[context$n_col]]) %>%
    sum()
  
  # 根据样本量返回对应小数位数
  if (row_total < 50) 1 else 0
}

# 小样本测试:自动保留1位小数,避免求和误差
tbl_cross(data = trial[1:30,], row = trt, col = stage, 
          percent = "cell", digits = custom_digits)

# 全量数据集测试:自动保留0位小数,保持简洁
tbl_cross(data = trial, row = trt, col = stage, 
          percent = "cell", digits = custom_digits)

方法2:主题设置(全局生效)

如果希望所有tbl_cross都自动应用这个规则,可以通过gtsummary的主题设置全局配置:

# 设置全局主题
set_gtsummary_theme(
  theme = list(
    tbl_cross.digits = custom_digits
  )
)

# 后续调用tbl_cross无需再传digits参数,自动生效
tbl_cross(data = trial[1:30,], row = trt, col = stage, percent = "cell")

灵活调整规则

如果需要基于列样本量或整体数据集大小来调整格式,只需要修改custom_digits里的样本量计算逻辑:

  • 按整体样本量:total_n <- nrow(context$df)
  • 按列样本量:col_total <- context$df %>% filter(.data[[context$col_var]] == context$col_val) %>% pull(.data[[context$n_col]]) %>% sum()

这样就能精准控制不同场景下的数字格式,彻底解决小样本百分比求和异常的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:25:03