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

R语言中group_by结合shapiro.test()无法运行的问题求助

解决分组Shapiro正态性检验的报错问题

报错原因

你用group_by()之后直接调用shapiro.test()的写法有误:group_by()返回的是分组数据框,但shapiro.test()的第一个参数需要是向量,且它不接受额外位置参数。你传入的as.numeric(Outcome)被当成了第二个未定义的参数,因此触发unused argument错误。直接用data$Outcome会传入整个列的所有值,而非分组后的子集,自然也无效。

可行解决方案

方法1:用dplyr的do()函数(兼容旧版dplyr)

data %>%
  group_by(Condition) %>%
  do(shapiro_res = shapiro.test(as.numeric(.$Outcome))) %>%
  # 提取检验结果的统计量和p值
  mutate(statistic = shapiro_res$statistic,
         p_value = shapiro_res$p.value) %>%
  select(-shapiro_res) # 移除结果列表列

这里用.$Outcome从分组数据框中提取对应列的向量,符合shapiro.test()的参数要求。

方法2:用dplyr结合broom包整理结果(推荐,输出更整洁)

先安装并加载broom包:

install.packages("broom")
library(broom)

然后运行分组检验:

data %>%
  group_by(Condition) %>%
  summarize(shapiro_test = list(tidy(shapiro.test(as.numeric(Outcome))))) %>%
  unnest(shapiro_test)

tidy()会把检验结果转换成数据框格式,unnest()则将列表列展开成标准表格,直接查看统计量、p值等信息。

方法3:Base R原生写法(无需dplyr)

# 按Condition拆分Outcome向量
split_outcome <- split(data$Outcome, data$Condition)
# 对每个子集做Shapiro检验
lapply(split_outcome, function(x) shapiro.test(as.numeric(x)))

这种写法更直接,适合不熟悉dplyr的场景,输出是包含两组检验结果的列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:52:43