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
table() function in R Language is used to create a categorical representation of data with variable name and the frequency in the form of a table.
table way. Unlike data. frame, the := operator adds a column to both the object living in the global environment and used in the function.
setDT converts lists (both named and unnamed) and data. frames to data. tables by reference. This feature was requested on Stackoverflow.
frame in R is similar to the data table which is used to create tabular data but data table provides a lot more features than the data frame so, generally, all prefer the data. table instead of the data.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With