2013-08-02 30 views
12

से फॉर्मूला में चर निकालें मेरे पास एक सूत्र है जिसमें कुछ शर्तें और डेटा फ्रेम (पहले model.frame() कॉल का आउटपुट) शामिल है जिसमें उन सभी शर्तों और कुछ और शामिल हैं। मैं मॉडल फ्रेम का सबसेट चाहता हूं जिसमें सूत्र में दिखाई देने वाले चर शामिल हैं।डेटा फ्रेम

ff <- log(Reaction) ~ log(1+Days) + x + y 
fr <- data.frame(`log(Reaction)`=1:4, 
       `log(1+Days)`=1:4, 
       x=1:4, 
       y=1:4, 
       z=1:4, 
       check.names=FALSE) 

वांछित परिणाम fr शून्य से z स्तंभ (fr[,1:4] धोखा दे रही है - मैं एक कार्यक्रम संबंधी समाधान की जरूरत है ...) है

कुछ रणनीतियों ऐसा नहीं काम:

fr[all.vars(ff)] 
## Error in `[.data.frame`(fr, all.vars(ff)) : undefined columns selected 

(क्योंकि all.vars()"Reaction", log("Reaction") नहीं)

stripwhite <- function(x) gsub("(^ +| +$)","",x) 
vars <- stripwhite(unlist(strsplit(as.character(ff)[-1],"\\+"))) 
fr[vars] 
## Error in `[.data.frame`(fr, vars) : undefined columns selected 

(क्योंकि + पर विभाजन log(1+Days) शब्द को विभाजित करता है)।

मैं सूत्र के पार्स पेड़ से नीचे उतर के बारे में सोच कर दिया गया है:

ff[[3]]  ## log(1 + Days) + x + y 
ff[[3]][[1]] ## `+` 
ff[[3]][[2]] ## log(1 + Days) + x 

लेकिन मैं नहीं मिला है एक समाधान एक साथ रखा, और ऐसा लगता है जैसे मैं एक खरगोश की मांद नीचे जा रहा हूँ। विचार?

+0

मुख्य चर की तरह लगता है जो आपको समस्याएं पैदा कर रहा है 'लॉग (1 + दिन) 'है। क्या आपको इसे कॉल करना है या आप बस एक अलग नाम का उपयोग कर सकते हैं? – Thomas

+1

'attr (terms.formula (ff)," term.labels ") के बारे में क्या? –

+1

मैं एक सामान्य समाधान के साथ आने की कोशिश कर रहा हूं। इसलिए, कुछ भी जो 'मॉडल में दिखाया जा सकता है।एक कानूनी सूत्र से उत्पन्न फ्रेम() 'को संभालना है। वह समस्या का हिस्सा है। –

उत्तर

4

यह काम करना चाहिए:

> fr[gsub(" ","",rownames(attr(terms.formula(ff), "factors")))] 
    log(Reaction) log(1+Days) x y 
1    1   1 1 1 
2    2   2 2 2 
3    3   3 3 3 
4    4   4 4 4 

और रोमन Luštrik को रंगमंच की सामग्री मुझे सही दिशा में इशारा करते हुए के लिए।

संपादित करें: ऐसा लगता है कि आप इसे बंद "चर" के रूप में अच्छी तरह से विशेषता बाहर खींच सकता है:

fr[gsub(" ","",attr(terms(ff),"variables")[-1])] 

संपादित करें 2: मिला पहली समस्या के मामले में, I() या offset() शामिल:

ff <- I(log(Reaction)) ~ I(log(1+Days)) + x + y 
fr[gsub(" ","",attr(terms(ff),"variables")[-1])] 

उन हालांकि, regex के साथ सही करने के लिए बहुत आसान होगा। लेकिन, यदि आपके पास ऐसे प्रश्नों की तरह स्थितियां थीं जहां एक चर कहा जाता है, उदाहरण के लिए, log(x) और I(log(y)) के साथ y के लिए किसी सूत्र के साथ सूत्र में उपयोग किया जाता है, तो यह वास्तव में गन्दा हो जाएगा।

+0

धन्यवाद। मैं इसे कुछ और मिनटों के लिए स्वीकार नहीं कर सकता। 'Gsub (...)' मेरे मामले में आवश्यक नहीं होगा, मुझे लगता है कि - सफेद स्थान में बेमेल वहाँ नहीं होगा। मैं इसे उदाहरण स्थापित करने में गलती की शुरुआत की। –

+0

@BenBolker हां, यह शायद अगर यह सामान्य है ... – Thomas

+1

लेकिन अपने मूल जवाब, 'rownames को देखने के लिए कुछ अन्य सूत्र निर्माण पर इस परीक्षण करने के लिए अच्छा होगा (attr (terms.formula (एफएफ)," कारकों "))) ', आपकी समस्या के मामले पर ठीक काम करता प्रतीत होता है। –

0

ऐसा लगता है कि एकमात्र समस्या फ्रैंक के दूसरे कॉलम के नाम पर एक जगह की कमी है। इस तरह से एक स्थान के साथ उसका नाम बदलें और कॉलम खींच:

ff <- log(Reaction) ~ log(1+Days) + x + y 
fr <- data.frame(`log(Reaction)`=1:4, 
       `log(1 + Days)`=1:4, 
       x=1:4, 
       y=1:4, 
       z=1:4, 
       check.names=FALSE) 


fr[labels(terms(ff))] 

यदि आपको लगता है दोनों के बीच फर्क सिर्फ इतना है हमेशा रहेंगे कि fr के नाम रिक्त स्थान है जहां ff में नाम नहीं करते हैं, तो उपरोक्त समाधान रखता है। मुझे labels(terms(x)) थोड़ा और पसंद है, हालांकि, क्योंकि यह थोड़ा और सार लगता है।

fr[gsub(pattern = ' ', replacement = '', x = labels(terms(ff)))]