R语言如何对列表内数据框批量执行ANOVA与HSD事后检验
R语言列表内多数据框批量执行ANOVA与HSD事后检验方案
核心思路是使用lapply()遍历列表中的每个数据框,对单个数据集独立完成建模、检验、标签匹配全流程,全程无需合并多个数据框,最终输出结构和原列表一致,每个子数据框直接追加HSD分组标记列。
完整实现代码
1. 加载依赖包
library(agricolae)
2. 构造示例数据(与提问中示例完全一致)
set.seed(2) df1 <- data.frame(Number = c("No1", "No2", "No3", "No1", "No2", "No3", "No1", "No2", "No3" ), value = sample(1:200, 9)) df2 <- data.frame(Number = c("No4", "No5", "No6", "No4", "No5", "No6", "No4", "No5", "No6" ), value = sample(1:200, 9)) df3 <- data.frame(Number = c("No7", "No8", "No9", "No7", "No8", "No9", "No7", "No8", "No9" ), value = sample(1:200, 9)) df <- list(df1 = df1,df2 = df2,df3 = df3)
3. 批量执行分析
df_processed <- lapply(df, function(current_df){ # 拟合当前数据框的ANOVA模型 anova_model <- aov(value ~ Number, data = current_df) # 执行Tukey HSD事后检验,保留控制台结果输出 hsd_result <- HSD.test( y = anova_model, trt = "Number", group = TRUE, console = TRUE, alpha = 0.3 ) # 绘制HSD分组图 plot(hsd_result) # 提取处理组与分组字母的对应表 group_mapping <- data.frame( Number = rownames(hsd_result$groups), Group = hsd_result$groups$groups, row.names = NULL ) # 将分组列匹配回原数据框,保持原数据行顺序不变 merged_data <- merge(current_df, group_mapping, by = "Number") merged_data <- merged_data[match(current_df$Number, merged_data$Number), ] rownames(merged_data) <- NULL return(merged_data) })
结果调用
处理完成后df_processed的结构和原输入列表完全一致,可直接按列表索引提取对应数据框结果:
# 查看df1的处理结果 df_processed$df1
输出格式和预期完全一致,Group列为HSD检验给出的分组标记:
Number value Group 1 No1 33 a 2 No1 164 a 3 No1 94 a 4 No2 125 a 5 No2 18 a 6 No2 127 a 7 No3 73 b 8 No3 37 b 9 No3 33 b
说明:代码中
alpha = 0.3为提问示例中使用的参数,实际分析可根据研究设计调整显著性阈值。
内容的提问来源于stack exchange,提问作者basti41a
相关产品推荐
相关产品推荐

