在dplyr中阅读do()
的文档,我对为数据组创建回归模型的能力印象深刻,并且想知道是否可以使用不同的自变量而不是复制它来复制它。数据组。
到目前为止,我已经尝试了
require(dplyr)
data(mtcars)
models <- data.frame(var = c("cyl", "hp", "wt"))
models <- models %>% do(mod = lm(mpg ~ as.name(var), data = mtcars))
Error in as.vector(x, "symbol") :
cannot coerce type 'closure' to vector of type 'symbol'
models <- models %>% do(mod = lm(substitute(mpg ~ i, as.name(.$var)), data = mtcars))
Error in substitute(mpg ~ i, as.name(.$var)) :
invalid environment specified
所需的最终输出类似于
var slope standard_error_slope
1 cyl -2.87 0.32
2 hp -0.07 0.01
3 wt -5.34 0.56
我意识到类似的事情是可能的using a lapply approach,但是发现申请家庭在很大程度上是不可理解的。有没有dplyr解决方案?
答案 0 :(得分:7)
链接页面中的方法没有什么特别复杂的。使用substitute
和as.name
有点神秘,但这很容易纠正。
varlist <- names(mtcars)[-1]
models <- lapply(varlist, function(x) {
form <- formula(paste("mpg ~", x))
lm(form, data=mtcars)
})
dplyr不是R编程的全部和全部。我建议熟悉* apply函数,因为它们可以在dplyr无法工作的许多情况下使用。
答案 1 :(得分:4)
这不是纯粹的“dplyr”,而是“dplyr”+“tidyr”+“data.table”。不过,我认为它应该很容易阅读。
library(data.table)
library(dplyr)
library(tidyr)
mtcars %>%
gather(var, val, cyl:carb) %>%
as.data.table %>%
.[, as.list(summary(lm(mpg ~ val))$coefficients[2, 1:2]), by = var]
# var Estimate Std. Error
# 1: cyl -2.87579014 0.322408883
# 2: disp -0.04121512 0.004711833
# 3: hp -0.06822828 0.010119304
# 4: drat 7.67823260 1.506705108
# 5: wt -5.34447157 0.559101045
# 6: qsec 1.41212484 0.559210130
# 7: vs 7.94047619 1.632370025
# 8: am 7.24493927 1.764421632
# 9: gear 3.92333333 1.308130699
# 10: carb -2.05571870 0.568545640
如果您真的只想要一些变量,请先使用矢量,而不是data.frame
。
models <- c("cyl", "hp", "wt")
mtcars %>%
select_(.dots = c("mpg", models)) %>%
gather(var, val, -mpg) %>%
as.data.table %>%
.[, as.list(summary(lm(mpg ~ val))$coefficients[2, 1:2]), by = var]
# var Estimate Std. Error
# 1: cyl -2.87579014 0.3224089
# 2: hp -0.06822828 0.0101193
# 3: wt -5.34447157 0.5591010