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

