आर

2012-01-09 12 views
5

में एक टुकड़े टुकड़े समारोह को परिभाषित करने के लिए कैसे मैं आर का उपयोग करके एक टुकड़े टुकड़े समारोह को परिभाषित करना चाहता हूं, हालांकि, मेरा आर कोड गलत हो जाता है। कोई सुझाव स्वागत है।आर

x<-seq(-5, 5, by=0.01) 
    for (x in -5:5){ 
    if (-0.326 < x < 0.652) fx<- 0.632 
    else if (-1.793<x<-1.304) fx<- 0.454 
    else if (1.630<x<2.119) fx<-0.227 
    else fx<- 0 } 
+0

यह स्पष्ट करने योग्य हो सकता है कि यह उदाहरण एक चरण कार्य है, टुकड़े टुकड़े के कार्यों का एक विशेष वर्ग है। चरण कार्यों के लिए, 'stepfun' (@KenWIlliams द्वारा उल्लिखित) और 'approxfun' दोनों अच्छी तरह से काम करते हैं। 'approxfun' भी टुकड़े-रैखिक कार्यों को समायोजित करता है (लेकिन सामान्य टुकड़े टुकड़े नहीं)। – dzeltzer

उत्तर

12

या आप ifelse इस्तेमाल कर सकते हैं।

fx <- ifelse(x > -0.326 & x <0.625, 0.632, 
    ifelse(x > -1.793 & x < -1.304, 0.454, 
    ifelse(x > 1.630 & x < 2.119, 0.227, 0))) 
2

हो सकता है कि अगर आप की स्थिति

if((-1.793<x) & (x < 0.652)) ... 

संपादित विभाजित: यह सब होने के लिए नहीं लगता है, यहाँ एक अलग दृष्टिकोण है:

x<-seq(-5, 5, by=0.01) 
fx <- function(x) { 
    res <- rep(0, length(x)) 
    res[(-0.326 < x) & (x < 0.652)] <- 0.632 
    res[(-1.793<x) & (x < (-1.304))] <- 0.454 
    res[(1.630<x) & (x <2.119)] <- 0.227 
    return(res) 
} 
fx(x) 
+0

आपके उत्तर के लिए धन्यवाद। मैं कोशिश करूँगा –

+0

आपका दृष्टिकोण काम करता है। बहुत धन्यवाद। –

+1

उन bitwise '&' के साथ सावधान रहें। इस मामले में कोई समस्या नहीं है, लेकिन '&&' के साथ बेहतर छड़ी, और इसी तरह '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – fotNelton

15

इस प्रयास करें:

x <- seq(-5, 5, 0.01) 
fx <- (x > -0.326 & x <0.625) * 0.632 + 
     (x > -1.793 & x < -1.304) * 0.454 + 
     (x > 1.630 & x < 2.119) * 0.227 
plot(x, fx) 
+0

अच्छा।गैबर के अनुभव को देखते हुए, मुझे लगता है कि यह मेरे "स्विच" दृष्टिकोण की तुलना में तेज़ी से चलता है (बड़ी संख्या में 'सेगमेंट')। –

1

जब तक आप कटऑफ अंक अलग है, मैं switch का उपयोग करेंगे। यहां एक उदाहरण w/सरलीकृत कट मान है।

xcuts<-1:10 #the values at which you change fx assignment 
xx<- seq(1.5,10,5, by =10) #vector of fx values to be selected 
switch(max(which(x>xcuts)), 
1= fx<-xx[1], 
2= fx<-xx[2], 
..."et cetera"... 
) 

एक्स पर लूप।

+0

बहुत अच्छी विधि। धन्यवाद। –

2

फिर भी एक और विकल्प, इस बार cut का उपयोग कर रहा है।

regions <- c(-Inf, -1.793, -1.304, -0.326, 0.652, 1.63, 2.119, Inf) 
group <- cut(x, regions) 
f_values <- c(0, 0.454, 0, 0.632, 0, 0.227, 0) 
(fx <- f_values[group]) 
+0

धन्यवाद। यह बहुत उपयोगी है। –

10

मैं पार्टी के लिए थोड़ा देर हो चुकी हूं, लेकिन मैं ऐसा करने के कुछ और तरीकों को पोस्ट करने का विरोध नहीं कर सका। असली लाइन पर अंतराल के साथ काम करने के लिए दोनों आर क्षमताओं का लाभ उठाते हैं।

आप वैक्टर cuts और vals इसलिए की तरह में अपने कटौती अंक और समारोह मान निर्धारित हैं:

cuts <- c(-Inf, -1.793, -1.304, -0.326, 0.625, 1.630, 2.119) 
vals <- c( 0, 0.454,  0, 0.632,  0, 0.227,  0) 

तो फिर तुम कुशलता से अपने cutpoints में x के मूल्यों को देखने के लिए findInterval उपयोग कर सकते हैं:

fx <- vals[findInterval(x, c(-Inf, cuts))] 

यदि इस फ़ंक्शन को केवल स्थिर मान देखने की तुलना में फैनसीयर सामान करने की आवश्यकता होती है, तो आप vals में अभिव्यक्ति या फ़ंक्शंस या जो भी चाहें डाल सकते हैं, संभवतः यूएसआई यदि आप चाहें तो list पर।

वैकल्पिक रूप से, के बाद से इस समारोह में एक कदम समारोह है, तो आप stepfun उपयोग कर सकते हैं:

f <- stepfun(cuts[-1], vals) 
fx <- f(x) 

तो फिर तुम भी stepfun का अच्छा अंकन तरीकों का उपयोग करने के लिए मिलता है।