为何R脚本与手动计算的行t检验p值结果不一致?
问题解析与修正
问题根源
你的代码里犯了一个逻辑错误:在apply的匿名函数中,df[, 7:13]取的是整个数据框后7列的所有行数据,而非当前行的后7个数值。
举个实际例子,当处理第一行(Gene1)时,row确实是第一行的前5个值c(1,4,4,0,-1),但df[,7:13]是3行×7列的完整数据集(共21个值),相当于拿第一行的5个值和全部3行的21个值做t检验,这和你手动执行的“仅第一行前后两组数据对比”完全不是一回事,自然p值差异巨大。
修正后的代码
方法1:基于apply的逐行处理
直接对除Assay外的所有列逐行处理,拆分当前行的前后两组数据:
p_values <- apply(df[, -1], 1, function(row) { group1 <- row[1:5] # 当前行前5个值 group2 <- row[6:12] # 当前行后7个值 t.test(group1, group2)$p.value }) df$p_values <- p_values
方法2:用dplyr的行级处理(更易读)
如果习惯tidyverse语法,用rowwise可以更直观地完成逐行计算:
library(dplyr) df <- df %>% rowwise() %>% mutate( p_values = t.test( c(DT1, DT2, DT3, DT4, DT5), c(DT6, DT7, DT8, DT9, DT10, DT11, DT12) )$p.value ) %>% ungroup()
验证结果
修正后运行代码,第一行的p值会和你手动计算的0.1425完全一致,符合你“逐行对比前后两组数据”的需求。
内容的提问来源于stack exchange,提问作者Lara
相关产品推荐
相关产品推荐

