create a formula in a data.table environment in R

data.table, environment, r

Solution

`lm` can accept a character string as the formula so combine that with `.SD` like this:

> 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

Problem

I would like to run a regression within a `data.table`. The `formula` needs to be constructed dynamically. I have tried the following method: ``` 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 ``` How does one specify the environment to be that of the actual data.table where the evaluation occurs? EDIT: I realize I can do lm(a ~ b). I need the formula to be dynamic so it's built up as a character string. By dynamically I mean the formula can be `paste0(var_1, "~", var_2)` where `var_1 = a` and `var_2 = b` Here is one solution thought I think we can do better: ``` 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 ```

Original source

Related problems