将 dplyr::do() 与 dplyr::mutate 组合?
Combining dplyr::do() with dplyr::mutate?
我想实现以下目标:对于数据集的每个子组,我想进行回归,并且该回归的残差应保存为原始数据框中的新变量。例如,
group_by(mtcars, gear) %>% mutate(res = residuals(lm(mpg~carb, .)))
表示我认为应该起作用,但不起作用(有人愿意解释为什么它不起作用吗?)。获取残差的一种方法是执行以下操作:
group_by(mtcars, gear) %>% do(res = residuals(lm(mpg~carb, .)))
这给了我一个数据框,其中保存了 dbl
个对象,即那些包含每个组的残差的对象。但是,它们似乎不包含可以帮助我将它们合并回原始数据的原始行名。
所以,我的问题是:如何以类似 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
-方法变得容易。我有一个没有行名的完整向量,所以我必须依靠向量的顺序来做到这一点,这对我来说似乎很麻烦。
#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))
})(.))
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)))))
我想实现以下目标:对于数据集的每个子组,我想进行回归,并且该回归的残差应保存为原始数据框中的新变量。例如,
group_by(mtcars, gear) %>% mutate(res = residuals(lm(mpg~carb, .)))
表示我认为应该起作用,但不起作用(有人愿意解释为什么它不起作用吗?)。获取残差的一种方法是执行以下操作:
group_by(mtcars, gear) %>% do(res = residuals(lm(mpg~carb, .)))
这给了我一个数据框,其中保存了 dbl
个对象,即那些包含每个组的残差的对象。但是,它们似乎不包含可以帮助我将它们合并回原始数据的原始行名。
所以,我的问题是:如何以类似 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
-方法变得容易。我有一个没有行名的完整向量,所以我必须依靠向量的顺序来做到这一点,这对我来说似乎很麻烦。
#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))
})(.))
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)))))