2013-02-09 6 views
18

Vorrei eseguire una regressione all'interno di data.table. Il formula deve essere costruito dinamicamente. Ho provato il seguente metodo:creare una formula in un ambiente data.table in R

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 

Come si fa a specificare l'ambiente ad essere quella del data.table effettivo in cui si verifica la valutazione?

EDIT: Mi rendo conto che posso fare lm (a ~ b). Ho bisogno che la formula sia dinamica, quindi è costruita come una stringa di caratteri. Con dinamicamente intendo la formula può essere paste0(var_1, "~", var_2) dove var_1 = a e var_2 = b

Ecco una soluzione pensato penso che possiamo fare meglio:

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 
+0

Penso che questo è solo un duplicato di http://stackoverflow.com/questions/14721592/r-dynamically-build-list-in-data-table-or-ddply/14721921#14721921 . Non votando per chiudere ancora perché penso che sia necessario spiegare e illustrare meglio ciò che intendi per "costruire dinamicamente". –

+1

leggerà, non ho visto quello, ma non penso che sia un duplicato. in particolare come si ottiene l'handle sull'ambiente all'interno del data.table effettivo? – Alex

risposta

15

lm può accettare una stringa di caratteri, come la formula in modo che si combinano con .SD in questo modo:

> 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 
+0

buona idea! non ci ho nemmeno pensato. potresti approfondire come far gestire l'ambiente all'interno del data.table effettivo? – Alex

+5

@Alex, Prova questo: 'x [, {e <- environment(); e $ a}] '. –

+0

+1 Non sapevo che (formula stringa di caratteri). –