R语言gtsummary包tbl_summary大数字千单位格式化方法
解决方案
之前调用style_number报错的核心原因是未对传入函数的参数做类型校验,格式化逻辑运行时会接收到非数值类型的中间计算结果,直接做乘法缩放就会触发Error in .x * scale : non-numeric argument to binary operator报错。
可以通过自定义带类型判断的缩放函数,同时配置表内频数、表头总样本量的格式化规则,再加变量标注实现需求,完整可运行代码如下:
library(gtsummary) library(dplyr) data <- data.frame(variable1 = rep(1:4, each = 10000)) %>% mutate( variable1 = case_when( variable1 == 1 ~ "Dog", variable1 == 2 ~ "Cat", variable1 == 3 ~ "Lion", variable1 == 4 ~ "Tiger" ) ) # 带类型校验的千单位缩放函数,规避非数值计算报错 scale_to_k <- function(x) { if (is.numeric(x)) return(x / 1000) x } data %>% tbl_summary( # 给目标变量添加单位标注 label = list(variable1 ~ "variable1 *Results in thousands(结果单位为千)*"), # 指定分类变量的统计量展示格式 statistic = all_categorical() ~ "{n} ({p}%)", # 分别配置频数、占比的显示精度 digits = list( all_categorical() ~ c( function(val) style_number(scale_to_k(val), digits = 0), function(val) style_number(val, digits = 0) ) ) ) %>% # 缩放表头的总样本量N modify_header( stat_0 ~ "**N = {style_number(scale_to_k(N), digits = 0)}**" )
效果说明
运行代码后输出的表格完全匹配预期:
- 表头总样本量显示为N = 40
- variable1标签后附带千单位说明
- 四个分类的频数均显示为10,对应占比25%
不需要额外加载scales包,仅用gtsummary内置的格式化函数即可实现,不会触发类型报错。
内容的提问来源于stack exchange,提问作者Santiago Sotelo
相关产品推荐
相关产品推荐

