2013-03-07 17 views
14

मेरे पास स्थान और तिथियों के साथ एक डेटासेट है। मैं वर्ष के सप्ताह (00-53) के रूप में गणना करना चाहता हूं लेकिन गुरुवार को सप्ताह के पहले दिन के रूप में उपयोग करना चाहता हूं। डेटा इस तरह दिखता है:वर्ष में सप्ताह संख्या (0-53) की गणना करें

location <- c(a,b,a,b,a,b) 
    date <- c("04-01-2013","26-01-2013","03-02-2013","09-02-2013","20-02-2013","03-03-2013") 
    mydf <- data.frame(location, date) 
    mydf 

मैं जानता हूँ कि इस वर्ष के सप्ताह की गणना के लिए strftime समारोह है कि वहाँ है, लेकिन यह केवल सोमवार या रविवार सप्ताह के पहले दिन के रूप में उपयोग करने के लिए संभव है। किसी भी मदद की अत्यधिक सराहना की जाएगी।

+0

यदि आप पूछ सकते हैं तो आप ऐसा क्यों करना चाहेंगे? – Arun

+3

तो अगर एक साल मंगलवार को शुरू हुआ, तो सप्ताह 1 मंगलवार/बुधवार और सप्ताह 2 गुरुवार को शुरू होता है ...? – joran

+0

हां। सप्ताह तक बुध तक ट्यू से होना चाहिए। – Eco06

उत्तर

22

बस दिनांक स्वरूपित मूल्यों के लिए 4 जोड़ें:

> mydf$Dt <- as.Date(mydf$date, format="%d-%m-%Y") 
> weeknum <- as.numeric(format(mydf$Dt+3, "%U")) 
> weeknum 
[1] 1 4 5 6 7 9 

यह एक 0 आधारित गिनती सम्मेलन का उपयोग करता है के बाद से है कि strftime क्या प्रदान करता है और हम सिर्फ इतना है कि कोड बेस बंद पिगीबैकिंग रहे है, तो एक में पहले शुक्रवार मंगलवार को शुरू होने वाला साल 2013 में मामला 1 सप्ताह का परिणाम होगा। यदि आप 1 आधारित सम्मेलन चाहते हैं तो मूल्य में 1 जोड़ें। (मूल रूप से, दिनांक-निर्धारित मान "मूल" से पूर्णांक अनुक्रम में होते हैं, इसलिए वे वास्तव में वर्षों या सप्ताहों को नहीं पहचानते हैं। 4 जोड़ना अंतर्निहित दिनांक-पूर्णांक के संदर्भ फ्रेम को बदलता है।)

नोट संपादित करें। गैबर की सलाह प्रति एक अतिरिक्त तीन रणनीति में बदल गया। .... जो अभी भी पिछले वर्ष के आखिरी सप्ताह से निपटने के सवाल का समाधान नहीं करता है।

+1

पर शुरू होता है, इस बारे में कुछ सवाल है कि सप्ताह संख्या की परिभाषा क्या है प्रश्न में 6 तारीखों से पहले वर्ष में 1, 4, 5, 6, 7, 9 गुरुवार को कोई भी दर है, जो इस सवाल का सवाल उठाती है कि उत्तर में 8 सही है या नहीं। इसके अलावा 'प्रारूप (as.Date ("2013-12-31") + 4, "% यू")' 00 देता है। –

+0

"ऐड -4" रणनीति गुरुवार को बढ़ती है इसलिए गुरुवार की गिनती समझौते में होगी एक "एड-3" रणनीति के साथ। –

+0

वर्ष की समस्या के अंत में एक फिक्स दिसंबर में 7 दिनों को घटा सकता है और फिर सप्ताह की गणना में 1 जोड़ सकता है: 'ifelse (months (d) ==" दिसंबर ", \t as.numeric (प्रारूप (डी -4, "% यू")) + 1, \t as.numeric (प्रारूप (डी + 3, "% यू")) '' –

2

चूंकि प्रश्न में कहा गया है कि सप्ताह 00-53 से चला जाता है, हम मानते हैं कि सप्ताह की संख्या प्रश्न में तारीख से पहले या उससे पहले गुरुवार की संख्या है। इस प्रकार, वर्ष में पहला गुरुवार सप्ताह 1 से शुरू होता है और सप्ताह 0 को उससे पहले किसी भी दिन सौंपा जाता है।

(टिप्पणियां थीं कि अगर वर्ष का पहला दिन मंगलवार था तो वह सप्ताह 1 होगा लेकिन अगर ऐसा होता तो ऐसा कोई सप्ताह नहीं हो सकता था जैसा कि विषय में आवश्यक होना चाहिए, इसलिए ठीक से कुछ स्पष्टीकरण सप्ताह संख्या की परिभाषा की क्या आवश्यकता हो सकती है। यहां हम पिछले अनुच्छेद में परिभाषा का उपयोग करने जा रहे हैं, लेकिन अगर हमें पता था कि परिभाषा क्या थी, तो इसे बदलना मुश्किल नहीं होगा। उदाहरण के लिए, अगर हम हमेशा पहले सप्ताह चाहते थे वर्ष में 1 होने के बावजूद यह एक छोटा सा सप्ताह था, फिर भी हम !is.thu(jan1(d)) परिणाम में जोड़ सकते थे।)

नीचे दिए गए दोनों समाधान पर्याप्त हैं कि उन्हें एक बयान में व्यक्त किया जा सकता है; हालांकि, हमने स्पष्टता के लिए प्रत्येक को कई छोटे कार्यों में शामिल किया है। पहला विशेष रूप से सीधे आगे है लेकिन दूसरा sapply की आवश्यकता के बिना स्वचालित रूप से वेक्टरकृत होता है और यह अधिक कुशल होगा।

1. योग गुरुवार साल में यह समाधान इनपुट d मानता वर्ग "Date" की है और बस से पहले या उस पर एक साल में गुरुवार की संख्या का योग:

is.thu <- function(x) weekdays(x) == "Thursday" 
jan1 <- function(x) as.Date(cut(x, "year")) 

week4 <- function(d) { 
    sapply(d, function(d) sum(is.thu(seq(jan1(d), d, by = "day")))) 
} 

हम इसे इस तरह का परीक्षण कर सकते :

d <- as.Date(c("2013-01-04", "2013-01-26", "2013-02-03", "2013-02-09", 
    "2013-02-20", "2013-03-03")) 
week4(d) # 1 4 5 6 7 9 

2. nextthu

zoo quickref vignette में फ़ंक्शन के आधार पर हम देखते हैं कि अगले गुरुवार के एपोक (1 980-01-01) के बाद से दिनों की संख्या (या दिन में पहले से ही गुरुवार को प्रश्न में दिन) को पहले में nextthu दिया गया है नीचे पंक्ति।

nextthu <- function(d) 7 * ceiling(as.numeric(d)/7) 

week4a <- function(d) (as.numeric(d) - nextthu(jan1(d))) %/% 7 + 1 

और यहाँ एक परीक्षण

week4a(d) # 1 4 5 6 7 9 

जोड़ा जाता है: दूसरा समाधान में निश्चित बग साल के पहले दिन को यह लागू करना हम परिणाम जहां d के रूप में पहले है निकाले जाते हैं।

संबंधित मुद्दे