如何在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
相关产品推荐
相关产品推荐

