在R的data.table环境中创建一个公式。

19

我想在 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

如何指定环境为数据表实际发生评估的环境?

编辑:我意识到我可以使用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

我认为这只是 https://dev59.com/zWUq5IYBdhLWcg3wKtbs#14721921 的重复。我暂时不投票关闭,因为我认为您需要更好地解释和说明“动态构建”的含义。 - IRTFM
1
我会仔细阅读,但我没有看到那个问题,但我不认为它是重复的。特别是如何在实际的data.table中获取环境句柄? - Alex
1个回答

16

lm可以接受一个字符字符串作为公式,因此可以像这样与.SD结合使用:

lm(.SD[[1]], data = .SD), by = id]

> 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

好主意!我甚至没有想到那个。你能详细说明如何在实际的数据表中获取环境句柄吗? - Alex
5
@Alex,试试这个:x[, {e <- environment(); e$a}] - G. Grothendieck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接