如何使用tidyverse按条件分组执行多个t检验并返回所有p值
调整后可直接运行的代码
library(tidyverse) library(broom) # 仅需要输出p值的简化写法 ds %>% select(quest, base, math:science) %>% pivot_longer(cols = -c(quest, base), names_to = "subject", values_to = "score") %>% # 同时按年龄组、科目两个维度分组,匹配你手动拆分的每个检验子集逻辑 group_by(quest, subject) %>% summarise(p_value = t.test(score ~ base, data = cur_data())$p.value, .groups = "drop") %>% as.data.frame()
如果需要保留t检验的全部统计结果(t值、置信区间、自由度等),可以用broom::tidy的完整写法:
ds %>% select(quest, base, math:science) %>% pivot_longer(cols = -c(quest, base), names_to = "subject", values_to = "score") %>% group_by(quest, subject) %>% summarise(t_result = list(tidy(t.test(score ~ base, data = cur_data()))), .groups = "drop") %>% unnest(t_result) %>% as.data.frame()
原代码问题说明
- 仅按
quest分组,没有把科目维度加入分组规则,导致每个分组内包含了数学、英语、科学三个科目的混合数据,和你手动筛选的检验子集逻辑不一致 - 不需要单独提取
t.test()的p.value再传给broom::tidy,tidy可以直接处理t检验返回的结果对象
内容的提问来源于stack exchange,提问作者Luis
相关产品推荐
相关产品推荐

