使用dplyr的summarise函数为分组宠物数据添加跨年份的t检验/ANOVA显著性检验结果
使用dplyr的summarise函数为分组宠物数据添加跨年份的t检验/ANOVA显著性检验结果
嘿,我来帮你搞定这个需求!你想要给每个宠物类别计算各年份的平均价格,同时自动根据年份数量选择t检验或ANOVA来得到显著性p值,最后整理成指定的宽格式表格对吧?下面是具体的实现方案:
首先,我们需要用到dplyr做数据分组和汇总,tidyr处理表格格式转换,还有broom包把统计检验的结果转换成容易处理的数据框格式——如果还没装这个包,先运行install.packages("broom")安装一下。
第一步:定义一个自动选择检验方法的函数
我们先写一个自定义函数,它会根据当前宠物组内的年份数量,自动选择双样本t检验(2个年份)或者单因素ANOVA(3个及以上年份),并返回对应的p值:
library(dplyr) library(tidyr) library(broom) get_significance_p <- function(data) { year_count <- length(unique(data$Year)) if (year_count == 2) { # 双样本t检验,这里默认假设方差齐性,需要的话可以加var.equal=FALSE用Welch检验 t_test_res <- t.test(Price ~ Year, data = data) tidy(t_test_res)$p.value } else if (year_count >= 3) { # 单因素ANOVA,提取年份因素对应的p值 anova_res <- aov(Price ~ Year, data = data) tidy(anova_res)$p.value[1] } else { # 如果只有1个年份,返回NA NA_real_ } }
第二步:整合数据汇总与检验逻辑
接下来我们把数据分组、计算均值、获取p值、转换格式的步骤整合起来:
result_df <- df %>% # 按宠物类别分组 group_by(Pet) %>% summarise( # 计算当前宠物各年份的平均价格,存成列表列方便后续展开 yearly_means = list(tibble(Year = unique(Year), Mean_Price = mean(Price))), # 调用自定义函数获取显著性p值,cur_data()获取当前分组的数据集 P_Value = get_significance_p(cur_data()) ) %>% # 展开年份均值的列表列 unnest(yearly_means) %>% # 转成宽格式,把年份作为列名 pivot_wider(names_from = Year, values_from = Mean_Price) %>% # 调整列顺序,让p值放在最后 select(Pet, `1990`, `1991`, `1992`, P_Value) # 查看结果 print(result_df)
结果说明
运行上面的代码后,你会得到和你预期一致的表格:
- 每个宠物一行,列依次是宠物类别、各年份的平均价格,最后是对应的显著性p值
- Fish只有1990和1991两个年份,所以用t检验;Cat和Dog有三个年份,用ANOVA
如果需要调整检验的参数(比如t检验的方差假设、ANOVA的事后检验等),直接修改get_significance_p函数里的逻辑就可以啦。
备注:内容来源于stack exchange,提问作者Luther_Proton
相关产品推荐
相关产品推荐

