使用lapply和公式列表自动化lm

时间:2016-12-11 18:48:07

标签: r

我在列表中有几个公式:

formulas <- list(
  mpg ~ disp,
  mpg ~ I(1 / disp),
  mpg ~ disp + wt,
  mpg ~ I(1 / disp) + wt
)

列名取自mtcars。我想知道为什么在下面的代码中R找不到对象mpg

lapply(formulas, function(f) with(mtcars, lm(formula = f)))      # (1)

错误是:Error in eval(expr, envir, enclos) : object 'mpg' not found

然而这可行

with(mtcars, lm(mpg ~ disp))`                                    # (2)

但是当我尝试从列表中提取任何公式时:

with(mtcars, lm(formulas[[1]]))                                  # (3)

R抱怨同样的错误:Error in eval(expr, envir, enclos) : object 'mpg' not found。令人惊讶的是,当我将mtcars附加到全局环境attach(mtcars)时,表达式(3)可以正常工作。

我虽然误解了with(),但是当我运行

with(mtcars, mpg)

我得到了正确的结果:

[1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 15.0 21.4

1 个答案:

答案 0 :(得分:3)

一种选择是在data电话

中指定lm
lst <- lapply(formulas, function(f) lm(formula = f, data=mtcars))
lst[[1]]
#Call:
#lm(formula = f, data = mtcars)

#Coefficients:
#(Intercept)         disp  
#   29.59985     -0.04122