आर

2010-08-27 47 views
5

में परिवर्तनीय नामों का वेक्टर मैं एक ऐसा फ़ंक्शन बनाना चाहता हूं जो स्वचालित रूप से यूनी और बहुविकल्पीय प्रतिगमन विश्लेषण उत्पन्न करता है, लेकिन मैं यह समझने में सक्षम नहीं हूं कि मैं वैक्टरों में ** चर निर्दिष्ट कैसे कर सकता हूं ... ** यह बहुत आसान लगता है, लेकिन प्रलेखन स्कीम मैं इसे बाहर अब तक लगा नहीं किया ...आर

आसान उदाहरण

a<-rnorm(100) 
b<-rnorm(100) 
k<-c("a","b") 
d<-c(a,b) 
summary(k[1]) 

लेकिन कश्मीर [1] = "एक" और एक चरित्र वेक्टर ... घ है बस बी को परिवर्तनीय नामों में शामिल नहीं किया गया है। असल में मैं वेक्टर ए का प्रतिनिधित्व करने के लिए के [1] चाहता हूं।

कोई जवाब की सराहना ...

// एम

उत्तर

10

आप "मिल" समारोह का उपयोग कर सकते जैसा कि इसके नाम का एक चरित्र स्ट्रिंग के आधार पर एक वस्तु प्राप्त करने के लिए, लेकिन लंबे समय में यह एक सूची में चर स्टोर करने के लिए बेहतर है और बस उन्हें इस तरह से एक्सेस करें, चीजें बहुत आसान हो जाती हैं, आप सबसेट ले सकते हैं, आप हर तत्व पर एक ही कोड चलाने के लिए लापरवाही या sapply का उपयोग कर सकते हैं। जब आप को सहेजना या हटाना हर तत्व को याद रखने की बजाय पूरी सूची पर काम कर सकता है। उदाहरण के लिए: "।":

yvar <- 'Sepal.Width' 
xvars <- c('Petal.Width','Sepal.Length') 
fit <- lm(Sepal.Width ~ ., data=iris[, c(yvar,xvars)]) 

mylist <- list(a=rnorm(100), b=rnorm(100)) 
names(mylist) 
summary(mylist[[1]]) 
# or 
summary(mylist[['a']]) 
# or 
summary(mylist$a) 
# or 
d <- 'a' 
summary(mylist[[d]]) 

# or 
lapply(mylist, summary) 

आप प्रोग्राम के एल एम (या अन्य मॉडलिंग कार्यों) के साथ विश्लेषण के लिए मॉडल बना रहे हैं, तो एक दृष्टिकोण सिर्फ अपने डेटा सबसेट और, जैसे उपयोग करने के लिए है

या आप "पेस्ट" या "sprintf" का उपयोग कर सूत्र का निर्माण कर सकते तो यह एक सूत्र में बदलने के लिए "as.formula" का उपयोग करें, जैसे:

yvar <- 'Sepal.Width' 
xvars <- c('Petal.Width','Sepal.Length') 
my.formula <- paste(yvar, '~', paste(xvars, collapse=' + ')) 
my.formula <- as.formula(my.formula) 
fit <- lm(my.formula, data=iris) 

यह भी ध्यान रखें अनेक तुलनाओं की समस्या आप देख रहे हैं, तो आदमी वाई विभिन्न मॉडल स्वचालित रूप से फिट बैठते हैं।

+0

दरअसल, as.formula() का उपयोग करना eval() parse() निर्माण से बहुत साफ है जिसका मैंने उपयोग किया था। –

+0

यह और भी बेहतर हो रहा है ... Thx – Misha

+1

सूची को प्री-आवंटित करने का एक अच्छा तरीका वेक्टर ("सूची", एन) के माध्यम से है जहां n सूची धारण करने वाले तत्वों की संख्या है। थोड़ा सा विषय होने के लिए खेद है। :) –

3

आप एक सूची k=list(a,b) इस्तेमाल कर सकते हैं। यह घटक ए और बी के साथ एक सूची बनाता है लेकिन परिवर्तनीय नामों की एक सूची नहीं है।

summary(get(k[1])) 

संपादित करें:

2

प्राप्त() आप जो खोज रहे हैं है() प्राप्त आप जो खोज रहे हैं नहीं है, यह सूची है()। प्राप्त करें() हालांकि भी उपयोगी हो सकता है।

यदि आप रिग्रेशन विश्लेषण की स्वचालित पीढ़ी की तलाश में हैं, तो आपको वास्तव में eval() का उपयोग करने से लाभ हो सकता है, हालांकि प्रत्येक आर-प्रोग्रामर आपको eval() का उपयोग करने के बारे में चेतावनी देगा, जब तक कि आप यह नहीं जानते कि आप क्या कर रहे हैं। कृपया उपयोग करने से पहले eval() और parse() के बारे में सहायता फ़ाइलों को बहुत सावधानी से पढ़ें।

एक उदाहरण:

d <- data.frame(
    var1 = rnorm(1000), 
    var2 = rpois(1000,4), 
    var3 = sample(letters[1:3],1000,replace=T) 
) 

vars <- names(d) 

auto.lm <- function(d,dep,indep){ 
     expr <- paste(
      "out <- lm(", 
      dep, 
      "~", 
      paste(indep,collapse="*"), 
      ",data=d)" 
    ) 
     eval(parse(text=expr)) 
     return(out) 
} 

auto.lm(d,vars[1],vars[2:3]) 
+0

यह ऐसा करेगा .. Thx एक लाख। मिशा – Misha

+0

आपका स्वागत है। लेकिन वास्तव में हैल्पो सही है। यदि आप वेक्टर 1 का प्रतिनिधित्व करने के लिए के [1] चाहते हैं, तो आपको एक सूची की आवश्यकता है। यह भी देखने लायक है। –