使用dplyr::do第二次执行时丢失group_by分组信息的技术求助
解决分组模型整理时丢失分组信息的问题
我明白你遇到的困扰——按cyl分组拟合线性模型后,用broom::tidy()整理结果时,第二次使用dplyr::do()会丢失分组标识。其实现在有更简洁且能保留分组信息的方法,不用依赖do()(它在dplyr 1.0.0之后已经不是最优选择啦),下面给你两种实用方案:
方案1:用mutate() + map() + unnest()保留分组
先拟合模型并存储为列表列,再逐个整理模型参数,最后展开结果,全程保留cyl分组:
library(tidyverse) library(broom) # 分组拟合模型,用summarise+list替代do() d1 <- mtcars %>% group_by(cyl) %>% summarise(mod_linear = list(lm(mpg ~ disp + hp, data = cur_data(), x = TRUE))) # 整理模型参数并保留分组 d1_tidy <- d1 %>% mutate(model_params = map(mod_linear, tidy)) %>% # 对每个模型应用tidy() unnest(model_params) # 展开参数列表为表格 # 查看结果,cyl分组信息完整保留 d1_tidy
方案2:用group_modify()一步到位
这是最简洁的方式,直接对每个分组数据框应用tidy(),结果自动绑定分组变量:
mtcars %>% group_by(cyl) %>% group_modify(~ tidy(lm(mpg ~ disp + hp, data = ., x = TRUE)))
为什么原来的do()会丢失分组?
当你用do()处理列表列里的模型时,比如d1 %>% do(tidy(.$mod_linear[[1]])),do()会将每个分组的结果合并,但默认不会主动保留分组变量cyl。而上面两种方法都是基于dplyr的现代语法,专门设计来处理分组操作时的结果保留问题,比旧版的do()更可靠。
内容的提问来源于stack exchange,提问作者guyabel
相关产品推荐
相关产品推荐

