You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:40:51