如何对数据框所有列按class分组执行t检验(替代循环)
按分组对多列执行t检验的高效实现方式
目标数据框
你拥有如下数据框:
X1 X2 X3 X4 X5 class 1 1 7 3 9 5 n 2 2 8 4 10 6 n 3 3 9 5 1 7 n 4 4 10 6 2 8 p 5 5 1 7 3 9 p 6 6 2 8 4 10 p
需求是按class变量分组,对所有X开头的列执行t检验,希望用比循环更高效简洁的方式实现。
现有代码(含修正后的数据构造)
原代码的数据构造存在问题,以下是修正后能生成目标数据框的代码:
# 修正后的数据构造代码 m1 <- data.frame( X1 = 1:6, X2 = c(7,8,9,10,1,2), X3 = 3:8, X4 = c(9,10,1,2,3,4), X5 = 5:10, class = rep(c("n","p"), each=3) ) # 单列t检验示例(可正常运行) t.test(X1~class, data= m1)
高效实现方法
方法1:使用purrr包(tidyverse风格)
借助purrr的map函数可以快速遍历所有目标列,自动生成t检验结果:
library(purrr) # 提取需要检验的列(排除class列) test_cols <- setdiff(names(m1), "class") # 批量执行t检验 t_test_results <- map(test_cols, ~t.test(reformulate("class", response = .x), data = m1)) # 给结果列表命名,方便按列名索引查看 names(t_test_results) <- test_cols # 示例:查看X1的检验结果 t_test_results$X1
方法2:基础R的lapply方法
无需额外安装包,用基础R的lapply即可实现:
# 提取需要检验的列 test_cols <- setdiff(names(m1), "class") # 批量执行t检验 t_test_results <- lapply(test_cols, function(col) { t.test(m1[[col]] ~ m1$class) }) # 给结果列表命名 names(t_test_results) <- test_cols # 示例:查看X2的检验结果 t_test_results$X2
可选:整理结果为整洁数据框
如果需要把所有检验的关键统计量汇总成数据框,方便对比查看,可以用以下代码:
library(dplyr) library(purrr) test_summary <- map_dfr(test_cols, function(col) { res <- t.test(reformulate("class", response = col), data = m1) tibble( 变量名 = col, t统计量 = round(res$statistic, 3), p值 = round(res$p.value, 4), 自由度 = round(res$parameter, 1) ) }) print(test_summary)
运行后会输出类似这样的整洁结果:
# A tibble: 5 × 4 变量名 t统计量 p值 自由度 <chr> <dbl> <dbl> <dbl> 1 X1 -2.73 0.039 4 2 X2 -0.27 0.799 3.2 3 X3 -2.73 0.039 4 4 X4 -0.27 0.799 3.2 5 X5 -2.73 0.039 4
内容的提问来源于stack exchange,提问作者Amir Asaadi
相关产品推荐
相关产品推荐

