आर

2011-08-24 12 views
10

के साथ एक वर्ष में सभी दिनों का एक वेक्टर जाओ वहाँ एक दिए गए वर्ष में दिनों की एक वेक्टर प्राप्त करने के लिए एक सरल आर मुहावरा है? (वर्ष + 1) में किसी भी मूल्यों को फ़िल्टर करने केआर

dtt <- as.Date(paste(as.character(year), "-1-1", sep="")) + seq(0,364) 

मैं, जाहिर है, एक लाइन जोड़ सकता है, लेकिन मैं वहाँ एक बहुत अनुमान लगा रहा हूँ: मैं जिसके बाद ठीक है ... लीप वर्ष के अलावा क्या कर सकते हैं ऐसा करने के लिए छोटा रास्ता।

उत्तर

18

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

R> length(seq(as.Date("2004-01-01"), as.Date("2004-12-31"), by="+1 day")) 
[1] 366 
R> length(seq(as.Date("2005-01-01"), as.Date("2005-12-31"), by="+1 day")) 
[1] 365 
R> 

यह nuttin का उपयोग करता है ', लेकिन आधार आर सही ढंग से तारीखों पर गणना करने के लिए आप अपने वेक्टर देने के लिए। यदि आप उच्च स्तरीय ऑपरेटरों चाहते हैं, तो उदाहरण देखें lubridate या यहाँ तक कि मेरी अधिक अल्पविकसित RcppBDT जो बूस्ट Time_Date पुस्तकालय के कुछ हिस्सों लपेटता पर।

+0

बस जोड़ने के एक '-1' दूसरे' as.Date' के बाद। – James

+0

अच्छा, उस बारे में सोचा नहीं था। यह वास्तव में इसे ठीक करेगा। इसके बारे में सोचने के लिए आओ, मैं अभी भी 20xx-12-31 का उपयोग कर सकता था। –

7

एक प्रकार की कटार के मार्गदर्शन का उपयोग करते हुए मैं इस पर बसे है:

getDays <- function(year){ 
    seq(as.Date(paste(year, "-01-01", sep="")), as.Date(paste(year, "-12-31", sep="")), by="+1 day") 
} 
+1

मैं एक उदार थोड़े आदमी हूँ;) –

0

मैं जानना दिलचस्पी अगर यह अनुक्रमण और कास्टिंग as.Date को उलटने के लिए तेजी से होगा होगा:

# My function getDays 
getDays_1 <- function(year) { 
    d1 <- as.Date(paste(year, '-01-01', sep = '')); 
    d2 <- as.Date(paste(year, '-12-31', sep = '')); 
    as.Date(d1:d2, origin = '1970-01-01'); 
}; 

# other getDays 
getDays_2 <- function(year) {  
    seq(as.Date(paste(year, '-01-01', sep='')), 
     as.Date(paste(year, '-12-31', sep='')), 
     by = '+1 day'); 
}; 

test_getDays_1 <- function(n = 10000) { 
    for(i in 1:n) { 
    getDays_1(2000); 
    }; 
}; 

test_getDays_2 <- function(n = 10000) { 
    for(i in 1:n) { 
    getDays_2(2000); 
    }; 
}; 

system.time(test_getDays_1()); 
# user system elapsed 
# 4.80 0.00 4.81 

system.time(test_getDays_2()); 
# user system elapsed 
# 4.52 0.00 4.53 

मैं अनुमान नहीं । । । ऐसा प्रतीत होता है कि अनुक्रमित Date ऑब्जेक्ट्स Date s

0

पर मुझे कुछ समान की आवश्यकता है, हालांकि मुझे उस तारीख में दिनों की संख्या जानना है। मैं निम्नलिखित समारोह है, जो इनपुट में दिनांक के रूप में ही लंबाई के साथ एक वेक्टर रिटर्न के साथ आया था।

days_in_year <- function(dates) { 
    years <- year(dates) 
    days <- table(year(seq(as.Date(paste0(min(years), '-01-01')), 
          as.Date(paste0(max(years), '-12-31')), 
          by = '+1 day'))) 
    as.vector(days[as.character(years)]) 
} 

यह एक प्रकार की कटार के समाधान के लिए इसी तरह काम करता है, लेकिन यह lubridate::year फ़ंक्शन का उपयोग करता दो बार सभी तिथियों के वर्ष हिस्सा मिलता है। टेबल का उपयोग लंबाई के समान ही होता है, हालांकि सभी अद्वितीय वर्षों के लिए। यह अत्यंत आवश्यक होता की तुलना में कुछ अधिक स्मृति का उपयोग कर सकते यदि दिनांक लगातार वर्षों में नहीं हैं।