如何手动创建含均值差置信区间与P值的组间对比统计汇总表
数据定义代码
mydata <- structure(list(Weight = c(66.2, 65.2, 69.8, 63.4, 67.4, 66.3, 63.8, 67.8, 66.7, 66.2, 61.9, 66.9, 69.4, 60.8, 64.1, 62.8, 62.5, 60.9, 61.3, 67.8), Age = c(68, 67, 65, 65, 63, 64, 68, 65, 65, 71, 64, 65, 68, 61, 65, 62, 60, 66, 62, 58), Sex = c("H", "H", "H", "H", "H", "H", "F", "F", "F", "F", "H", "H", "H", "F", "F", "F", "F", "F", "F", "F"), Group = c("G1", "G1", "G1", "G1", "G1", "G1", "G1", "G1", "G1", "G1", "G2", "G2", "G2", "G2", "G2", "G2", "G2", "G2", "G2", "G2")), row.names = c(NA, -20L), class = "data.frame")
需求说明
需要手动创建统计汇总表对比两组变量,表中需包含均值差的置信区间与P值,最终通过Rmarkdown导出为Word格式。目前已手动完成Weight变量的参数计算:
confInt <- paste(round(t.test(mydata$Weight~mydata$Group)$conf.int[1],2), round(t.test(mydata$Weight~mydata$Group)$conf.int[2],2),sep = ";") p.value <- round(t.test(mydata$Weight~mydata$Group)$p.value,3) mean1 <- mean(mydata$Weight[mydata$Group=="G1"]) mean2 <- mean(mydata$Weight[mydata$Group=="G2"]) mean_diff <- (mean(mydata$Weight[mydata$Group=="G1"]) - mean(mydata$Weight[mydata$Group=="G2"]))
希望通过循环或函数批量处理所有数值变量的上述参数,再用rbind合并结果,生成完整的汇总表。
批量处理与汇总表生成
1. 筛选数值变量
先从数据框中提取所有数值型变量(排除分类变量Sex和分组变量Group):
num_vars <- names(mydata)[sapply(mydata, is.numeric)]
2. 自定义统计函数
编写函数批量计算单变量的统计参数:
get_stats <- function(var_name) { var_data <- mydata[[var_name]] # 计算两组均值 mean_g1 <- mean(var_data[mydata$Group == "G1"]) mean_g2 <- mean(var_data[mydata$Group == "G2"]) # 均值差 mean_diff <- mean_g1 - mean_g2 # t检验结果 t_result <- t.test(var_data ~ mydata$Group) # 格式化置信区间 conf_int <- paste(round(t_result$conf.int[1], 2), round(t_result$conf.int[2], 2), sep = ";") # 格式化P值 p_val <- round(t_result$p.value, 3) # 返回结构化结果 data.frame( 变量名 = var_name, G1均值 = round(mean_g1, 2), G2均值 = round(mean_g2, 2), 均值差 = round(mean_diff, 2), 均值差置信区间 = conf_int, P值 = p_val, stringsAsFactors = FALSE ) }
3. 批量生成汇总表
用lapply遍历所有数值变量,再合并结果:
summary_table <- do.call(rbind, lapply(num_vars, get_stats))
运行后得到的summary_table示例输出:
变量名 G1均值 G2均值 均值差 均值差置信区间 P值 1 Weight 66.28 63.63 2.65 0.64;4.66 0.013 2 Age 66.10 63.10 3.00 0.08;5.92 0.045
4. Rmarkdown导出Word
将以下内容保存为.Rmd文件,点击RStudio的「Knit」按钮即可生成Word文档:
--- title: "两组变量统计汇总表" output: word_document --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = FALSE) # 加载数据 mydata <- structure(list(Weight = c(66.2, 65.2, 69.8, 63.4, 67.4, 66.3, 63.8, 67.8, 66.7, 66.2, 61.9, 66.9, 69.4, 60.8, 64.1, 62.8, 62.5, 60.9, 61.3, 67.8), Age = c(68, 67, 65, 65, 63, 64, 68, 65, 65, 71, 64, 65, 68, 61, 65, 62, 60, 66, 62, 58), Sex = c("H", "H", "H", "H", "H", "H", "F", "F", "F", "F", "H", "H", "H", "F", "F", "F", "F", "F", "F", "F"), Group = c("G1", "G1", "G1", "G1", "G1", "G1", "G1", "G1", "G1", "G1", "G2", "G2", "G2", "G2", "G2", "G2", "G2", "G2", "G2", "G2")), row.names = c(NA, -20L), class = "data.frame") # 定义统计函数 get_stats <- function(var_name) { var_data <- mydata[[var_name]] mean_g1 <- mean(var_data[mydata$Group == "G1"]) mean_g2 <- mean(var_data[mydata$Group == "G2"]) mean_diff <- mean_g1 - mean_g2 t_result <- t.test(var_data ~ mydata$Group) conf_int <- paste(round(t_result$conf.int[1], 2), round(t_result$conf.int[2], 2), sep = ";") p_val <- round(t_result$p.value, 3) data.frame( 变量名 = var_name, G1均值 = round(mean_g1, 2), G2均值 = round(mean_g2, 2), 均值差 = round(mean_diff, 2), 均值差置信区间 = conf_int, P值 = p_val, stringsAsFactors = FALSE ) } # 生成汇总表 num_vars <- names(mydata)[sapply(mydata, is.numeric)] summary_table <- do.call(rbind, lapply(num_vars, get_stats))
统计结果汇总表
knitr::kable(summary_table, align = "c")
内容的提问来源于stack exchange,提问作者Seydou GORO
相关产品推荐
相关产品推荐

