首页 文章

将dplyr :: do()与dplyr :: mutate结合起来?

提问于
浏览
1

我想实现以下目标:对于数据集的每个子组,我想进行回归,并且该回归的残差应该保存为原始数据帧中的新变量 . 例如,

group_by(mtcars, gear) %>% mutate(res = residuals(lm(mpg~carb, .)))

表明我认为应该起作用,但不是(任何人都在关心解释它为什么不起作用?) . 获取残差的一种方法是执行以下操作:

group_by(mtcars, gear) %>% do(res = residuals(lm(mpg~carb, .)))

这给了我一个保存 dbl 对象的数据帧,即那些包含每个组的残差的数据帧 . 但是,似乎它们不包含可帮助我将它们合并回原始数据的原始rownames .

所以,我的问题是:我怎样才能以dplyr的方式实现我想做的事情?

显然,它可以通过其他方式实现 . 举个例子,以下工作正常:

dat <- mtcars
 dat$res <- NA
 for(i in unique(mtcars$gear)){
   dat[dat$gear==i, "res"]  <- residuals(lm(mpg ~ disp, data=dat[dat$gear==i,]))
 }

但是,我的理解是 dplyr 是为此目的而制作的,所以应该采用 dplyr 式的方式?

任何提示/提示/评论表示赞赏 .

备注:此问题与lm() called within mutate()非常相似,只是在该问题中,每个组只保留一个参数,这使得 merge -approach变得容易 . 我有一个没有rownames的整个向量,所以我必须依靠向量的顺序来做到这一点,这对我来说似乎很麻烦 .

2 回答

  • 0
    library(lazyeval)
    eq <- "y ~ x"
    dat <- mtcars
    dat %>% 
        group_by(gear) %>% 
        mutate(res=residuals(lm(interp(eq, y = mpg, x = disp))))
    

    或没有 lazyeval

    dat %>% 
        group_by(gear) %>% 
        mutate(res=residuals(lm(deparse(substitute(mpg~disp)))))
    
  • 4
    #This gives you the residuals. You can then combine this with original data. 
    mtcars %>%
         group_by(cyl) %>%
         do(model = lm(mpg ~ wt, data=.)) %>%
         do((function(reg_mod) {
            data.frame(reg_res = residuals(reg_mod$model))
         })(.))
    

相关问题