broom::tidy与purrr::map_dfr配合失效问题求助
问题分析与解决办法
别着急,我帮你拆解下可能的问题,再给你几个靠谱的解决方案:
1. 先补全并修正基础代码
首先,你的代码里可能漏掉了broom包的加载(它不属于tidyverse核心包,得单独加载),而且部分分组的样本量可能会触发精确检验的报错,我们先把代码补全修正:
library(tidyverse) library(broom) # 必须单独加载这个包 # 转换iris为长格式 iris_long <- iris %>% pivot_longer(-Species, names_to = "measure", values_to = "value") # 按测量指标分组,执行组间Wilcoxon秩和检验(加exact=FALSE避免报错) iris_test_results <- iris_long %>% group_by(measure) %>% summarise(test = list(wilcox.test(value ~ Species, exact = FALSE)))
2. 两种正确的tidy+合并方式
方式一:mutate + unnest 分步处理
先给列表列里的每个检验结果做tidy整理,再展开合并成数据框:
tidy_wilcox_results <- iris_test_results %>% # 对每个检验对象执行tidy整理 mutate(tidy_output = map(test, broom::tidy)) %>% # 展开列表列成常规列 unnest(tidy_output) %>% # 移除不需要的原检验对象列表列 select(-test)
方式二:group_modify 一步到位
如果你不想先生成中间的列表列,也可以直接用group_modify在分组后直接处理并输出tidy结果:
tidy_wilcox_results <- iris_long %>% group_by(measure) %>% group_modify(~ broom::tidy(wilcox.test(.$value ~ .$Species, exact = FALSE)))
3. 常见踩坑点排查
如果还是跑不通,你可以检查这几个地方:
- 有没有加载
broom包:这是最容易漏掉的点,毕竟tidyverse不包含它 - 检验对象是否有效:比如某些分组的样本量太小,导致检验无法执行,可以提前过滤掉样本量不足的分组,或者加上
exact=FALSE参数 unnest语法问题:如果你用的是旧版tidyr,可能需要写成unnest(cols = c(tidy_output))而不是直接unnest(tidy_output)
内容的提问来源于stack exchange,提问作者Indrajeet Patil
相关产品推荐
相关产品推荐

