从R help文档中稍作修改的一个实例:
by_cyl <- group_by(mtcars, cyl)
models <- by_cyl %>% do(mod = lm(mpg ~ disp, data = .))
coefficients<-models %>% do(data.frame(coef = coef(.$mod)[[1]]))
在数据框架 coefficients 中,每个 cyl 组的线性模型的第一个系数。我的问题是如何生成一个数据框架,该数据框架不仅包含一个系数列,还包含一个分组变量列。
===== 编辑:我扩展了示例,试图更清楚地说明我的问题
假设我想提取模型的系数和一些预测。我可以这样做:
by_cyl <- group_by(mtcars, cyl)
getpars <- function(df){
fit <- lm(mpg ~ disp, data = df)
data.frame(intercept=coef(fit)[1],slope=coef(fit)[2])
}
getprediction <- function(df){
fit <- lm(mpg ~ disp, data = df)
x <- df$disp
y <- predict(fit, data.frame(disp= x), type = "response")
data.frame(x,y)
}
pars <- by_cyl %>% do(getpars(.))
prediction <- by_cyl %>% do(getprediction(.))
问题在于代码重复,因为我拟合了两次模型。我的想法是构建一个函数,返回包含所有信息的列表:
getAll <- function(df){
results<-list()
fit <- lm(mpg ~ disp, data = df)
x <- df$disp
y <- predict(fit, data.frame(disp= x), type = "response")
results$pars <- data.frame(intercept=coef(fit)[1],slope=coef(fit)[2])
results$prediction <- data.frame(x,y)
results
}
问题在于我不知道如何使用do()函数与getAll()函数一起使用,以获取仅包含参数的数据框(例如像数据框pars一样)。
summarise
代替第二个do
。summarise(models, coef = coef(summary(mod))[[1]],group=cyl) - akrun