按年份分组对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
相关产品推荐
相关产品推荐

