I would like to run a regression within a data.table
. The formula
needs to be constructed dynamically. I have tried the following method:
我想在data.table中运行回归。公式需要动态构建。我尝试了以下方法:
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?
如何将环境指定为进行评估的实际data.table的环境?
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
编辑:我意识到我可以做lm(a~b)。我需要公式是动态的,所以它被构建为一个字符串。通过动态我的意思是公式可以是paste0(var_1,“〜”,var_2)其中var_1 = a和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
1 个解决方案
#1
15
lm
can accept a character string as the formula so combine that with .SD
like this:
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
#1
15
lm
can accept a character string as the formula so combine that with .SD
like this:
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