如何仅将svyCreateTableOne生成表格的频数四舍五入为整数?
解决tableone加权分层表格仅取整频数、保留百分比小数的问题
问题背景
使用tableone和survey包创建加权分层TableOne表格时,需要实现:
- 分组样本量
n及分类变量的频数freq四舍五入为整数 - 百分比保留小数位数
但print()的catDigits参数会同时对百分比取整,不符合需求;自行修改tab1$CatTable中的freq和n列后,得到的是22.0这类带小数位的数值,无法直接导出。
解决方案
核心是将取整后的数值转换为整数类型(而非保留数值型的整数形式),同时单独处理分层样本量n,最后通过print()参数控制百分比小数位。
完整代码流程
- 数据构建与表格初始化(沿用原代码)
library(tableone) library(survey) set.seed(123) data <- data.frame( married = sample(c(1, 0), 100, replace = TRUE), nodegree = sample(c(1, 0), 100, replace = TRUE), age = rnorm(100, mean = 50, sd = 10), treat = rbinom(100, size = 1, prob = 0.3), weight = 0 # 初始化权重变量 ) data$weight[data$treat == 1] <- runif(sum(data$treat == 1), min = 0.03, max = 0.87) data$weight[data$treat == 0] <- runif(sum(data$treat == 0), min = 0.03, max = 0.87) datasvy <- survey::svydesign(~1, data = data, strata = ~treat, weights = ~weight) tab1 <- svyCreateTableOne(vars = c("married", "nodegree"), strata = "treat", data = datasvy, factorVars = c("married", "nodegree"))
- 修改表格中的频数与样本量
# 定义需要处理的分类变量 vars <- c("married", "nodegree") # 遍历修改分类变量的freq和n,取整后转为整数类型 for (i in seq_along(tab1$CatTable)) { for (var in vars) { tab1$CatTable[[i]][[var]]$freq <- as.integer(round(tab1$CatTable[[i]][[var]]$freq)) tab1$CatTable[[i]][[var]]$n <- as.integer(round(tab1$CatTable[[i]][[var]]$n)) } } # 修改分层样本量n,取整后转为整数类型 tab1$n <- as.integer(round(tab1$n))
- 打印并导出表格
# catDigits设置为1,保留百分比1位小数 print(tab1, catDigits = 1)
预期输出
Stratified by treat 0 1 p test n 36 11 married = 1 (%) 22 (60.3) 6 (51.0) 0.469 nodegree = 1 (%) 17 (46.7) 5 (45.6) 0.934
关键说明
round()函数返回的是数值型(numeric),即使结果为整数也会显示为x.0;通过as.integer()转换为整数类型后,即可去掉小数后缀。tab1$n存储的是分层样本量,需要单独修改才能替换表格顶部的n取值。
内容的提问来源于stack exchange,提问作者geek45
相关产品推荐
相关产品推荐

