按Accession分组对长格式数据执行t.test的R语言问题求助
问题排查与解决
你遇到的问题根源很明确——在do()函数里调用t.test()时,你传入的是整个原始数据集Book18_melt,而不是group_by(Accession)后拆分出的每个分组子集。这就导致每个Accession分组都在对全量数据做t检验,结果自然完全相同。
修正后的代码
把t.test()里的数据集参数换成.(在dplyr的do()语境中,.代表当前分组的子数据框):
data_frame <- Book18_melt %>% group_by(Accession) %>% do(broom::tidy(t.test(value ~ X1, data = ., var.equal = TRUE))) %>% ungroup()
额外注意事项
NA值处理:从你给出的长格式数据来看,存在
NA值。t.test()默认会自动忽略含NA的观测,但如果某个分组里其中一组(35S或N85)的有效数据不足2个,会报错。你可以提前过滤NA,或者在t.test()里加上na.action = na.omit明确处理:data_frame <- Book18_melt %>% group_by(Accession) %>% do(broom::tidy(t.test(value ~ X1, data = ., var.equal = TRUE, na.action = na.omit))) %>% ungroup()分组有效性检查:建议先检查每个Accession下,35S和N85组是否都有足够的样本量(至少2个非NA值),避免后续报错:
sample_check <- Book18_melt %>% filter(!is.na(value)) %>% count(Accession, X1) %>% tidyr::pivot_wider(names_from = X1, values_from = n) print(sample_check)
这样修改后,每个Accession都会独立进行组间t检验,得到的p值就会是对应分组的真实结果了。
内容的提问来源于stack exchange,提问作者tralala
相关产品推荐
相关产品推荐

