如何在R中结合nest与unnest使用report包生成多组统计报告
问题解决方法
你的报错根源是**report()函数需要直接处理原始统计模型对象(如t.test()返回的htest类),而不是broom::tidy()整理后的表格数据**。你现在传递给report()的是tidy处理后的tibble,丢失了模型的元信息,导致函数无法解析,进而出现NaN警告和命名匹配错误。
修正步骤:
- 修改
t_test函数,返回原始的t.test模型对象,而非tidy后的表格 - 保留模型对象在嵌套数据框中,直接对模型调用
report() - 按需提取或整理报告内容
修正后的完整代码:
library(broom) library(dplyr) library(tidyr) library(report) library(purrr) df <- tibble(id = c(1,2,3,4,5,6,7,8), group = c(1,1,1,1,2,2,2,2), before = c(2,1,3,1,2,1,2,4), after = c(1,3,4,7,3,9,3,7)) # 修改函数:返回原始t.test模型,而非tidy后的表格 t_test <- function(df, mu = 0, alt = "two.sided", paired = T, conf.level = .99) { t.test(df$before, df$after, mu = mu, alt = alt, paired = paired, conf.level = conf.level) } # 嵌套数据并生成模型、报告 d <- df %>% group_by(group) %>% nest() %>% mutate(model = map(data, t_test), # 存储原始模型 group_report = map(model, report)) # 对每个模型生成报告 # 查看第1组的报告 d$group_report[[1]] # 将报告转为文本格式并整理成表格 report_table <- d %>% mutate(report_text = map_chr(group_report, as.character)) %>% select(group, report_text) print(report_table)
补充说明:
- 原代码中
unnest(ttest, .drop = T)的警告是因为tidyr 1.0.0之后弃用了.drop参数,现在默认保留所有列表列,若不需要data列,可在后续用select(-data)移除。 - 如果需要同时保留tidy后的统计结果,可以同时存储模型和tidy结果:
d <- df %>% group_by(group) %>% nest() %>% mutate(model = map(data, t_test), ttest_tidy = map(model, tidy), group_report = map(model, report)) %>% unnest(ttest_tidy)
内容的提问来源于stack exchange,提问作者sbac
相关产品推荐
相关产品推荐

