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

如何按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:37:19