You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 15:36:24