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

如何在R语言中按分组执行Shapiro检验?解决代码报错问题

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

我来帮你搞定这个报错!你的代码有两个关键问题,咱们一步步修正:

问题1:没有保存mutate后的结果

你运行mutate(df, ratio_log = log10(Ratio))后,没有把新生成的列保存回df,导致后续代码找不到ratio_log这一列。先把这个问题修正:

library(dplyr) # 先加载dplyr包,确保管道和mutate功能可用

Type <- c("Bark", "Redwood", "Oak")
size <- c(10,15,13)
width <- c(3,4,5)
Ratio <- size/width
df <- data.frame(Type, size, width, Ratio)

# 将mutate的结果赋值回df,这样df里就新增了ratio_log列
df <- df %>% mutate(ratio_log = log10(Ratio))

问题2:shapiro.test的调用方式错误

shapiro.test只接受一个数值向量作为输入,不能直接在group_by后的管道里像你那样传参数。我们需要用summarize对每个分组单独执行检验,这里有两种常用方法:

方法1:用broom包整理成整洁表格(推荐)

这个方法会把检验结果转换成结构化的数据框,方便查看和后续分析:

library(broom) # 如果没安装先执行:install.packages("broom")

shapiro_results <- df %>%
  group_by(Type) %>%
  # 对每组的ratio_log执行Shapiro检验,结果暂存为列表
  summarize(shapiro_test = list(shapiro.test(ratio_log))) %>%
  # 把列表中的检验结果展开为整洁格式
  mutate(tidy_result = purrr::map(shapiro_test, tidy)) %>%
  unnest(tidy_result)

# 查看最终结果
print(shapiro_results)

方法2:手动提取统计量和p值(无需额外包)

如果不想安装broom,可以直接提取检验的核心结果:

shapiro_results <- df %>%
  group_by(Type) %>%
  summarize(
    W统计量 = shapiro.test(ratio_log)$statistic,
    p值 = shapiro.test(ratio_log)$p.value
  )

# 查看结果
print(shapiro_results)

报错原因解释

你原来的代码df %>% group_by(Type) %>% shapiro.test(ratio_log)中,管道会把分组后的df传给shapiro.test作为第一个参数,但shapiro.test只需要一个数值向量,不需要额外的ratio_log参数,所以才会出现unused argument (ratio_log)的错误。通过summarize调用shapiro.test(ratio_log),就能针对每个分组的ratio_log向量单独执行检验了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:13:41