आर

2013-02-09 9 views
18

में डेटाटेबल वातावरण में एक सूत्र बनाएं, मैं data.table के भीतर एक रिग्रेशन चलाने के लिए चाहता हूं। formula को गतिशील रूप से निर्मित करने की आवश्यकता है। मैं निम्नलिखित विधि की कोशिश की है:आर

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 

कैसे एक वातावरण वास्तविक data.table जहां मूल्यांकन होता है कि होने के लिए निर्दिष्ट करता है?

संपादित करें: मुझे एहसास है कि मैं एलएम (ए ~ बी) कर सकता हूं। मुझे सूत्र को गतिशील होने की आवश्यकता है, इसलिए इसे एक वर्ण स्ट्रिंग के रूप में बनाया गया है। गतिशील रूप से मेरा मतलब सूत्र हो सकता है paste0(var_1, "~", var_2) जहां var_1 = a और var_2 = b

यहाँ एक समाधान सोचा था कि मैं लगता है कि हम बेहतर कर सकते हैं:

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

मुझे लगता है कि यह सिर्फ http://stackoverflow.com/questions/14721592/r-dynamically-build-list-in-data-table-or-ddply/14721921#14721921 का डुप्लिकेट है । अभी तक बंद करने के लिए वोट नहीं दे रहा है क्योंकि मुझे लगता है कि आपको "गतिशील रूप से निर्माण" के द्वारा बेहतर अर्थों को समझाने और स्पष्ट करने की आवश्यकता है। –

+1

पढ़ेगा, उसे नहीं देखा लेकिन मुझे नहीं लगता कि यह एक डुप्लिकेट है। विशेष रूप से वास्तविक डेटा.table के भीतर पर्यावरण पर संभाल कैसे प्राप्त करता है? – Alex

उत्तर

15

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

अच्छा विचार! इसके बारे में भी सोचा नहीं था। क्या आप संभावित डेटाटेबल के भीतर पर्यावरण संभाल कैसे प्राप्त कर सकते हैं? – Alex

+5

@ एलेक्स, इसे आज़माएं: 'x [, {e <- पर्यावरण(); ई $ ए}] '। –

+0

+1 मुझे नहीं पता था कि या तो (चरित्र स्ट्रिंग फॉर्मूला)। –