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

使用broom(augment)与dplyr处理loess拟合时出现错误

解决loess拟合后调用augment出现行数不匹配的问题

嘿,我刚碰到过类似的坑!你遇到的Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 32, 11,本质是用旧的do()函数处理分组loess模型时,broom在合并结果阶段没法正确对应每个分组的数据和模型输出,导致行数冲突。

为什么会出错?

你用group_by(cyl) %>% do(fit = loess(wt ~ mpg, .))生成的regressions数据框,每行对应一个cyl分组,但直接调用augment(fit)时,dplyr没办法自动把每个分组的augment结果和原分组数据正确关联,反而试图把所有结果强行合并——总观测数32和单个分组的11行数据凑不到一起,自然就报错了。而且do()在新版本dplyr里已经被弃用,更推荐用更清晰的分组处理方式。

两种可行的解决方案

方案1:用nest() + map()(灵活,适合后续还要处理模型的场景)

先把每个分组的数据嵌套成列表,再逐个拟合模型、生成augment结果,最后展开:

library(broom)
library(dplyr)
library(purrr)

mtcars %>%
  group_by(cyl) %>%
  nest() %>%  # 把每个cyl分组的数据打包成列表列
  mutate(
    fit = map(data, ~ loess(wt ~ mpg, data = .x)),  # 逐个拟合loess模型
    augmented = map2(fit, data, ~ augment(.x, newdata = .y))  # 对每个模型+对应数据生成augment结果
  ) %>%
  unnest(augmented)  # 展开嵌套的结果,得到完整的拟合数据

方案2:用group_modify()(最简洁,直接处理分组)

dplyr的group_modify()专门用来处理分组数据的自定义操作,它会自动帮你关联每个分组的结果:

library(broom)
library(dplyr)

mtcars %>%
  group_by(cyl) %>%
  group_modify(~ augment(loess(wt ~ mpg, data = .x)))

验证结果

运行上面任意一段代码,你都会得到32行的结果(和原mtcars行数一致),里面包含原变量、拟合值.fitted、残差.resid等loess模型的输出,完全符合预期。

内容的提问来源于stack exchange,提问作者Steve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:39:35