Создать формулу в среде data.table в R

Я хотел бы запустить регрессию в 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

Как определить среду как таковую на фактической таблице данных, где происходит оценка?

EDIT: Я понимаю, что могу сделать lm (a ~ b). Мне нужна формула, чтобы быть динамичной, поэтому она создавалась как символьная строка. Динамически я имею в виду, что формула может быть paste0(var_1, "~", var_2), где var_1 = a и var_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

Ответы

Ответ 1

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