假设我想使用purrr::map创建一个模型列表,每个模型都使用一个不同的变量作为预测器。我想我可以做这样的事情:
library(tidyverse)
myvars <- vars(cyl, disp, hp)
list_of_models <- map(myvars, function(x) lm(mpg ~ !!x, data = mtcars))有人能解释一下为什么这个不起作用吗?
所需的输出为:
list(
lm(mpg ~ cyl, data = mtcars),
lm(mpg ~ disp, data = mtcars),
lm(mpg ~ hp, data = mtcars))发布于 2019-08-21 23:24:50
一种选择是转换为字符串,使用reformulate创建公式并将其传递给lm
library(rlang)
library(purrr)
out2 <- map(myvars, ~ {
fmla <- reformulate(as_name(.x), 'mpg')
lm1 <- lm(fmla, data = mtcars)
lm1$call$formula <- fmla
lm1 })-output
out2
#[[1]]
#Call:
#lm(formula = mpg ~ cyl, data = mtcars)
#Coefficients:
#(Intercept) cyl
# 37.885 -2.876
#[[2]]
#Call:
#lm(formula = mpg ~ disp, data = mtcars)
#Coefficients:
#(Intercept) disp
# 29.59985 -0.04122
#[[3]]
#Call:
#lm(formula = mpg ~ hp, data = mtcars)
#Coefficients:
#(Intercept) hp
# 30.09886 -0.06823 使用OP的输出执行-checking
out1 <- list(
lm(mpg ~ cyl, data = mtcars),
lm(mpg ~ disp, data = mtcars),
lm(mpg ~ hp, data = mtcars))
setequal(out1, out2)
#[1] TRUE发布于 2019-08-22 05:41:25
这是一种有点不同的方法,但很容易遵循。
library(tidyverse)
library(purrr)
library(magrittr)
mtcars %>%
select(cyl, disp, hp) %>%
map(~lm(mtcars$mpg ~ .x, data = mtcars))输出
$`cyl`
Call:
lm(formula = mtcars$mpg ~ .x, data = mtcars)
Coefficients:
(Intercept) .x
37.885 -2.876
$disp
Call:
lm(formula = mtcars$mpg ~ .x, data = mtcars)
Coefficients:
(Intercept) .x
29.59985 -0.04122
$hp
Call:
lm(formula = mtcars$mpg ~ .x, data = mtcars)
Coefficients:
(Intercept) .x
30.09886 -0.06823 希望这能有所帮助!
https://stackoverflow.com/questions/57594836
复制相似问题