如何提取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
相关产品推荐
相关产品推荐

