如何用dplyr对数据框各AOI下KPI列做Stimuli A/B的t检验并汇总
用dplyr自动化AOI分组下的KPI t检验与均值汇总
问题背景
我有一份可复现的R数据集:
set.seed(949494) KPI1 <- round(runif(50, 1, 100)) KPI2 <- round(runif(50, 1, 100)) KPI3 <- round(runif(50, 1, 100)) ID <- rep(c("ID1", "ID2", "ID3", "ID4", "ID5", "ID6", "ID7", "ID8", "ID9", "ID10"), times = c(5, 5, 5, 5, 5, 5, 5, 5, 5, 5)) Stimuli <- rep(rep(c("A", "B"), times = c(5, 5)), 5) AOI <- rep(c("Text", "Picture", "Button", "Product", "Logo"), 5) DF <- data.frame(ID, Stimuli, AOI, KPI1, KPI2, KPI3)
在更大的数据集上,手动对每个AOI(Text、Picture等)下的各KPI列(KPI1、KPI2、KPI3)分别做Stimuli A与B的t检验效率极低。作为R初学者,希望用dplyr实现自动化操作,最终汇总出包含t检验p值和各AOI下KPI均值(跨所有ID)的表格。
解决方案
通过dplyr结合tidyr可以轻松实现批量处理,步骤如下:
- 先加载所需的R包:
library(dplyr) library(tidyr)
- 将宽格式数据转为长格式,方便按KPI分组处理:
df_long <- DF %>% pivot_longer(cols = starts_with("KPI"), names_to = "KPI", values_to = "Value")
- 按AOI和KPI分组,批量计算均值并执行t检验,汇总结果:
summary_table <- df_long %>% group_by(AOI, KPI) %>% summarise( # 计算Stimuli A和B的均值 Mean_A = mean(Value[Stimuli == "A"], na.rm = TRUE), Mean_B = mean(Value[Stimuli == "B"], na.rm = TRUE), # 执行两样本t检验并提取p值 t_test_p_value = t.test(Value ~ Stimuli, data = cur_data())$p.value, .groups = "drop" # 计算完成后取消分组 ) # 查看最终汇总表 print(summary_table)
关键代码说明
pivot_longer:把分散的KPI1/KPI2/KPI3列转换为"KPI"(变量名)和"Value"(对应数值)的长格式,让每个AOI+KPI组合都能独立处理。group_by(AOI, KPI):设置双重分组,确保每个AOI下的每个KPI单独计算均值和t检验。cur_data():在分组计算中,指代当前分组的子数据集,给t.test提供对应的数据子集。t.test(Value ~ Stimuli):以Stimuli为分组变量,对KPI数值做两样本t检验,通过$p.value直接提取检验的p值。
可选调整
如果需要指定t检验的方差齐性假设(比如假设方差相等),可以修改t.test的参数:
t_test_p_value = t.test(Value ~ Stimuli, data = cur_data(), var.equal = TRUE)$p.value
内容的提问来源于stack exchange,提问作者Smuts94
相关产品推荐
相关产品推荐

