2014-05-13 7 views
22

मैं 1 99 3 से ब्राजील इंडेक्स (आईबीओवी) से दैनिक रिटर्न के साथ काम कर रहा हूं, मैं 2 तिथियों के बीच की अवधि के लिए सबसेट करने का सबसे अच्छा तरीका जानने की कोशिश कर रहा हूं।2 तिथियों के बीच डेटाफ्रेम सब्सक्राइब करें

डेटा फ्रेम (IBOV_RET) इस प्रकार है:

head(IBOV_RET) 
     DATE 1D_RETURN 
1 1993-04-28 -0.008163265 
2 1993-04-29 -0.024691358 
3 1993-04-30 0.016877637 
4 1993-05-03 0.000000000 
5 1993-05-04 0.033195021 
6 1993-05-05 -0.012048193 
... 

2 चर DATE1 और DATE2 दिनांक के रूप में स्थापित

DATE1 <- as.Date("2014-04-01") 
DATE2 <- as.Date("2014-05-05") 

मैं इस कोड का उपयोग एक नया सबसेट बनाने में सक्षम था:

TEST <- IBOV_RET[IBOV_RET$DATE >= DATE1 & IBOV_RET$DATE <= DATE2,] 

यह काम करता था, लेकिन मैं सोच रहा था कि क्या 212 के बीच डेटा को सब्सक्राइब करने का एक बेहतर तरीका है, शायद subset का उपयोग करना।

+2

आप अपने dataframe '' df'' और अपनी तिथियाँ '' t1'' और '' t2'' नाम हैं, तो आप कुछ कम प्राप्त कर सकते हैं जैसे: 'डीएफ [डीएफ $%%% t1: t2,]' '। स्पष्टीकरण के लिए, 't1: t2'' तिथियों के साथ काम करता है, इसलिए आपको असमानताओं की आवश्यकता नहीं है। – PatrickT

उत्तर

5

आप & ऑपरेटर के साथ subset() फ़ंक्शन का उपयोग कर सकते हैं:

subset(IBOV_RET, DATE1> XXXX-XX-XX & DATE2 < XXXX-XX-XX) 
+2

आपको अभी भी अपनी दिनांक तारों को as.Date() फ़ंक्शन के साथ लपेटने की आवश्यकता होगी ... – Dan

3

वहाँ तिथि सीमाओं को निकालने के लिए कोई वास्तविक अन्य तरीका है। तर्क संख्यात्मक मानों की एक श्रृंखला को निकालने के समान ही है, आपको बस स्पष्ट तिथि रूपांतरण करने की आवश्यकता है जैसा आपने किया है। आप subset या with के साथ किसी भी अन्य सबसेटिंग कार्य के साथ अपनी सबसेटिंग कम कर सकते हैं। आप श्रेणियों को cut के साथ अंतराल में तोड़ सकते हैं (एक विशिष्ट cut.Date अधिभार है)। लेकिन बेस आर में दिनांक अक्षर निर्दिष्ट करने का कोई तरीका नहीं है ताकि आप रूपांतरण से बच सकें। मैं कल्पना नहीं कर सकता कि आपके मन में अन्य प्रकार के वाक्यविन्यास क्या हो सकते हैं।

15

जैसा कि पहले से ही @MrFlick द्वारा इंगित किया गया है, आप सबसेटिंग के मूल तर्क के आसपास नहीं आते हैं। आपके विशिष्ट डेटा को सब्सक्राइब करना आपके लिए आसान बनाने का एक तरीका है। फ्रेम एक ऐसे फ़ंक्शन को परिभाषित करना होगा जो आपके उदाहरण में DATE1 और DATE2 जैसे दो इनपुट लेता है और फिर उन सबसेट पैरामीटर के अनुसार IBOV_RET का सबसेट देता है।

myfunc <- function(x,y){IBOV_RET[IBOV_RET$DATE >= x & IBOV_RET$DATE <= y,]} 

DATE1 <- as.Date("1993-04-29") 
DATE2 <- as.Date("1993-05-04") 

Test <- myfunc(DATE1,DATE2)  

#> Test 
#  DATE X1D_RETURN 
#2 1993-04-29 -0.02469136 
#3 1993-04-30 0.01687764 
#4 1993-05-03 0.00000000 
#5 1993-05-04 0.03319502 

तुम भी myfunc में सीधे विशिष्ट दिनांक दर्ज कर सकते हैं:

myfunc(as.Date("1993-04-29"),as.Date("1993-05-04")) #will produce the same result 
0

मैं इन सबसे छुटकारा dplyr पैकेज प्यार
तो अगर आप

>library("dplyr") 

और फिर, तुमने किया था के रूप में:

>Date1<-as.Date("2014-04-01") 
>Date2<-as.Date("2014-05-05") 

अंत में

>test<-filter(IBOV_RET, filter(DATE>Date1 & DATE<Date2)) 
0

के बारे में क्या:

DATE1 <- as.Date("1993-04-29") 
DATE2 <- as.Date("1993-05-04") 

# creating a data range with the start and end date: 
dates <- seq(DATE1, DATE2, by="days") 

IBOV_RET <- subset(IBOV_RET, DATE %in% dates) 
संबंधित मुद्दे