You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 12:04:37