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

如何提取ANOVA的P值并追加至已有dataframe?

批量提取单因素ANOVA的P值

问题背景

我有一个10行300列的数据框,第一列为分组(A、B、C等),其余列是蛋白表达量。已完成每列的单因素ANOVA分析,但手动逐个提取P值效率极低,需要自动提取所有列的ANOVA P值并生成新的数据框。

数据示例

structure(list(acc = c("A", "A", "B", "B", "B", "C", "C", "C", "D", "D"), 
               A0A8L2QEN5 = c(130.3, 110.4, 123.3, 143.2, 110.4, 130.5, 109.1, 106.4, 19.5, 16.9), 
               P63018 = c(97.1, 93.4, 103.1, 102.2, 110.9, 113, 122.7, 135.1, 60.6, 61.9), 
               P85108 = c(99.1, 103.5, 97.9, 89.8, 87.8, 94.9, 87.8, 96.9, 121.5, 120.7), 
               A0A8L2R7U3 = c(95.9, 101.1, 97.5, 96.6, 87.4, 97.9, 82.3, 103.7, 119.5, 118.1)), 
          class = "data.frame", row.names = c(NA, -10L))

现有ANOVA代码

fit_aov <- function(col) {
  aov(col ~ trt, data = df_long)
}

anovas <- map(df_long[, 2:ncol(df_long)], fit_aov)

单个P值提取方式:summary(anovas$protein2)[[1]][1,5]


解决方案

方法1:自定义函数批量提取

基于现有anovas列表,用purrr批量提取P值并整理成数据框:

library(purrr)

# 定义提取P值的函数
get_pvalue <- function(model) {
  summary(model)[[1]][1, 5]
}

# 批量提取并生成包含蛋白名和P值的数据框
anova_pvals <- map_dfr(anovas, ~data.frame(p_value = get_pvalue(.x)), .id = "protein_name")

# 查看结果
head(anova_pvals)

方法2:使用broom包简化(推荐)

broom包可以将统计模型结果转换为整洁的数据框,处理更高效:

library(purrr)
library(broom)

# 提取所有ANOVA结果,筛选分组因素的P值
anova_clean <- map_dfr(anovas, tidy, .id = "protein_name") %>%
  filter(term == "trt") %>% # 仅保留分组变量的统计结果
  select(protein_name, p.value) # 保留需要的列

# 查看结果
head(anova_clean)

注意事项

  • 若实际分组变量是acc而非trt,需将fit_aov函数中的公式改为col ~ acc
  • 若未安装broom包,先执行:install.packages("broom")

内容的提问来源于stack exchange,提问作者Gabrielle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:12:12