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

按年份分组对Weight列执行Shapiro-Wilks检验的R代码问题

解决分组执行Shapiro-Wilks检验的报错问题

你遇到的错误是因为shapiro.test不是dplyr的分组动词,无法直接接在group_by()之后使用——它会把整个分组后的data.frame作为第一个参数传入,而Weight就成了未被识别的多余参数。下面是几种可行的解决方法:

方法1:使用dplyr::do()(传统分组处理方式)

do()允许对每个分组应用任意函数,我们可以把检验结果存为列表列,再提取需要的统计量:

library(dplyr)

df3 %>%
  group_by(Year) %>%
  do(shapiro_result = shapiro.test(.$Weight)) %>%
  mutate(
    统计量 = shapiro_result$statistic,
    p值 = shapiro_result$p.value
  ) %>%
  select(-shapiro_result)  # 移除临时列表列

方法2:使用dplyr::summarize()结合直接提取结果(简洁版)

如果只需要统计量和p值,可以直接在summarize()里调用shapiro.test并提取对应字段:

df3 %>%
  group_by(Year) %>%
  summarize(
    shapiro_stat = shapiro.test(Weight)$statistic,
    shapiro_p = shapiro.test(Weight)$p.value,
    .groups = "drop"  # 取消分组,输出普通数据框
  )

方法3:结合purrr优化提取(高效版)

如果需要多次提取检验结果的不同字段,先把结果存为列表列,再用purrr的函数批量提取,避免重复调用检验函数:

library(dplyr)
library(purrr)

df3 %>%
  group_by(Year) %>%
  summarize(
    shapiro_res = list(shapiro.test(Weight)),
    .groups = "drop"
  ) %>%
  mutate(
    统计量 = map_dbl(shapiro_res, ~ .x$statistic),
    p值 = map_dbl(shapiro_res, ~ .x$p.value)
  ) %>%
  select(-shapiro_res)

注意事项

Shapiro-Wilks检验对样本量有要求:通常样本数在3~5000之间结果较为可靠,若分组样本量超出这个范围,建议考虑其他正态性检验方法。

内容的提问来源于stack exchange,提问作者Anna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 07:42:36