2013-02-09 13 views
18

Ich möchte eine Regression innerhalb einer data.table ausführen. Die formula muss dynamisch erstellt werden. Ich habe die folgende Methode versucht:Erstellen Sie eine Formel in einer data.table-Umgebung 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 

Wie man die Umwelt nicht angeben, dass der Ist-data.table zu sein, wo die Auswertung erfolgt?

EDIT: Ich weiß, ich kann lm (a ~ b) tun. Ich brauche die Formel, um dynamisch zu sein, also wird sie als Zeichenkette aufgebaut. Durch die dynamische meine ich die Formel paste0(var_1, "~", var_2) sein kann, wo var_1 = a und var_2 = b

Hier ist eine Lösung, dachte ich denke, wir tun können, besser:

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

ich denke, das nur ein Duplikat http://stackoverflow.com/questions/14721592/r-dynamically-build-list-in-data-table-or-ddply/14721921#14721921 ist . Ich stimme noch nicht zu, zu schließen, weil ich denke, dass Sie besser erklären und illustrieren müssen, was Sie mit "dynamisch bauen" meinen. –

+1

wird durchlesen, habe das nicht gesehen, aber ich glaube nicht, dass es ein Duplikat ist. insbesondere wie bekommt man die Umgebung in der eigentlichen data.table in den Griff? – Alex

Antwort

15

lm kann eine Zeichenfolge akzeptieren, wie die Formel so kombinieren, dass mit .SD wie folgt aus:

> 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

gute Idee! Daran habe ich gar nicht gedacht. Könntest du vielleicht herausfinden, wie man das Environment-Handle innerhalb der eigentlichen data.table bekommt? – Alex

+5

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

+0

+1 Ich wusste das auch nicht (Zeichenkettenformel). –

Verwandte Themen