在group_by中拟合模型后重新进行观察

时间:2016-01-29 23:55:03

标签: r dplyr

我想在每组拟合模型后找到剩余的观察结果。我原以为代码看起来像

library(dplyr)
df %>%
 group_by(group) %>%
   do(residual=resid(lm(y~x, data=.))) %>%
 ungroup()

但是这会折叠df并且不会留下x变量的痕迹。我想要的是一个类似于

的数据框返回
group |y| x| residual

1 个答案:

答案 0 :(得分:3)

1)dplyr 出于示例的目的,这使用了R附带的malloc数据框。我注意到如果删除双引号但下面的代码会阻塞公式如果公式作为字符串传递,它可以正常工作:

iris

1a)即使没有字符串公式,此变体也可以使用:

iris %>%
 group_by(Species) %>%
   do(mutate(., resid = resid(lm("Sepal.Length ~ Sepal.Width", .)))) %>%
 ungroup()

1b),这种变化也有效:

iris %>%
 group_by(Species) %>%
   do(cbind(., resid = resid(lm(Sepal.Length ~ Sepal.Width, .)))) %>%
 ungroup()

2)基础R 我们也可以考虑不使用dplyr而只是像这样使用基础R:

iris %>%
 group_by(Species) %>%
   do(transform(., resid = resid(lm(Sepal.Length ~ Sepal.Width, .)))) %>%
 ungroup()

3)data.table 如果考虑到速度,你可能想尝试一下data.table,这通常是最快的方法,而且在这里也非常紧凑:

f <- function(ix) resid(lm(Sepal.Length ~ Sepal.Width, iris, subset = ix))
transform(iris, resid = ave(seq_along(Species), Species, FUN = f))

3a)有趣的是,(1)的这种变化适用于data.table输入和实际公式(不是字符串)。此外,不需要library(data.table) dt <- as.data.table(iris) dt[, resid := resid(lm(Sepal.Length ~ Sepal.Width, .SD)), by = Species]

do()

注意:我添加了dplyr issue 1648