R语言table1函数:如何排除NA、保留1位小数并添加置信区间?
解决table1函数的小数位数设置与置信区间添加问题
一、设置1位小数位数
你的现有代码已通过PCTnoNA%实现排除缺失值,要控制小数位数,需自定义渲染函数,用sprintf()指定格式(%.1f表示保留1位小数)。修改后的代码如下:
# 自定义连续变量渲染函数,控制小数位数为1位 render_continuous <- function(x) { x <- na.omit(x) # 计算并格式化统计量 mean_sd <- sprintf("%.1f [%.1f]", mean(x), sd(x)) median_iqr <- sprintf("%.1f [%.1f, %.1f]", median(x), quantile(x, 0.25), quantile(x, 0.75)) min_max <- sprintf("%.1f, %.1f", min(x), max(x)) # 返回结果列表 c("Mean [SD]" = mean_sd, "Median [Q25, Q75]" = median_iqr, "Min, Max" = min_max) } # 自定义分类变量渲染函数,百分比保留1位小数 render_categorical <- function(x) { x <- na.omit(x) freq <- table(x) pct <- prop.table(freq)*100 # 格式化频率和百分比 sapply(names(freq), function(n) sprintf("%d (%.1f%%)", freq[n], pct[n])) } # 调用table1 table1(~ . | Sex.x, data = adulttab[-1], render.categorical = render_categorical, render.continuous = render_continuous)
说明:
- 连续变量:通过
sprintf("%.1f", ...)强制所有数值保留1位小数; - 分类变量:百分比部分用
%.1f%%控制1位小数,同时保留原始频率; - 所有统计量计算前通过
na.omit(x)确保排除缺失值,与你的需求一致。
二、添加均值的95%置信区间
要在table1中加入置信区间,只需在自定义连续变量渲染函数中增加置信区间的计算逻辑,再将其加入返回结果即可:
render_continuous_with_ci <- function(x) { x <- na.omit(x) n <- length(x) mean_val <- mean(x) sd_val <- sd(x) # 用t分布计算95%置信区间(适配小样本) ci_low <- mean_val - qt(0.975, df = n-1)*sd_val/sqrt(n) ci_high <- mean_val + qt(0.975, df = n-1)*sd_val/sqrt(n) # 格式化所有统计量为1位小数 mean_sd <- sprintf("%.1f [%.1f]", mean_val, sd_val) mean_ci <- sprintf("%.1f (%.1f-%.1f)", mean_val, ci_low, ci_high) median_iqr <- sprintf("%.1f [%.1f, %.1f]", median(x), quantile(x, 0.25), quantile(x, 0.75)) min_max <- sprintf("%.1f, %.1f", min(x), max(x)) # 返回包含置信区间的结果 c("Mean [SD]" = mean_sd, "Mean (95% CI)" = mean_ci, "Median [Q25, Q75]" = median_iqr, "Min, Max" = min_max) } # 调用table1 table1(~ . | Sex.x, data = adulttab[-1], render.categorical = render_categorical, render.continuous = render_continuous_with_ci)
说明:
- 这里用
t分布计算置信区间,适合小样本场景;若为大样本,可替换为正态分布的qnorm(0.975); - 置信区间会作为单独一行(
Mean (95% CI))出现在连续变量的统计结果中。
三、注意事项
- 确保
adulttab$Sex.x是分类变量(因子类型),若不是可先通过factor(adulttab$Sex.x)转换; - 自定义渲染函数可灵活调整,你能根据需求增减统计量或修改格式。
内容的提问来源于stack exchange,提问作者Joy
相关产品推荐
相关产品推荐

