20

我想在data.table. formula需要动态构建。我尝试了以下方法:

x = data.table(a=1:20, b=20:1, id=1:5)
> x[,as.list(coef(lm(as.formula("a ~ b")))),by=id]
  Error in eval(expr, envir, enclos) : object 'a' not found

如何将环境指定为进行评估的实际 data.table 的环境?

编辑:我意识到我可以做 lm(a ~ b)。我需要公式是动态的,因此它被构建为字符串。通过动态我的意思是公式可以在paste0(var_1, "~", var_2)哪里var_1 = avar_2 = b

这是我认为我们可以做得更好的一种解决方案:

txt = parse(text="as.list(coef(lm(a ~ b)))")
> x[,eval(txt),by=id]
  id (Intercept)  b
  1:  1          21 -1
  2:  2          21 -1
  3:  3          21 -1
  4:  4          21 -1
  5:  5          21 -1
4

1 回答 1

16

lm可以接受字符串作为公式,因此将其与.SD如下组合:

> x[, as.list(coef(lm("a ~ b", .SD))), by = id]
   id (Intercept)  b
1:  1          21 -1
2:  2          21 -1
3:  3          21 -1
4:  4          21 -1
5:  5          21 -1
于 2013-02-09T03:19:01.090 回答