如何按color分组对df的value列执行shapiro.test()并解决报错
解决按分组执行Shapiro-Wilk检验的报错问题
报错原因
你用summarise直接调用shapiro.test(value)时出错,是因为shapiro.test()返回的是包含统计量、p值等信息的列表对象,而summarise要求每个分组返回可简化为向量的结果,无法直接处理列表。
解决方案
以下是几种实用的处理方式:
1. 用broom包整理结构化结果(推荐)
broom::tidy()可以将检验结果转换为标准数据框格式,方便后续分析:
# 先安装并加载依赖包 install.packages("broom") library(broom) library(dplyr) df %>% group_by(color) %>% summarise(tidy(shapiro.test(value)), .groups = "drop")
执行后会得到每个color分组对应的W统计量、p值、检验方法等结构化列。
2. 手动提取指定检验指标
如果只需要统计量和p值,可以直接从检验结果中提取:
library(dplyr) df %>% group_by(color) %>% summarise( shapiro_W = shapiro.test(value)$statistic, shapiro_p_value = shapiro.test(value)$p.value, .groups = "drop" )
3. 保留完整检验对象
如果需要后续对检验结果做更多操作,可以用嵌套数据框或group_modify保存完整的检验对象:
# 方法:嵌套数据框 library(dplyr) library(tidyr) df %>% nest(data = c(value)) %>% mutate(shapiro_result = purrr::map(data, ~ shapiro.test(.$value))) %>% unnest_wider(shapiro_result) # 方法:group_modify df %>% group_by(color) %>% group_modify(~ tibble(test_obj = list(shapiro.test(.$value)))) %>% ungroup()
注意事项
Shapiro-Wilk检验对样本量有要求(通常需要≥3个样本),如果部分分组样本量不足,会触发额外报错,可以提前过滤:
df %>% group_by(color) %>% filter(n() >= 3) %>% # 过滤样本量不足的分组 summarise(tidy(shapiro.test(value)), .groups = "drop")
内容的提问来源于stack exchange,提问作者Balina
相关产品推荐
相关产品推荐

