2013-03-22 7 views
13

मैं संदर्भ और माप दिनांक और स्रोत आधे जीवन (वर्षों में मापा गया) के बीच अंतर के आधार पर स्रोत गतिविधि को सही करना चाहता हूं। मैंआर वर्षों में तारीख अंतर (फ्लोटिंग पॉइंट)

ref_date <- as.Date('06/01/08',format='%d/%m/%y') 

और एक ही तिथि प्रारूप के साथ मेरी data.frame में एक स्तंभ, जैसे,

today <- as.Date(Sys.Date(), format='%d/%m/%y') 

मैं lubridate पैकेज

year(today)-year(ref_date) 
[1] 5 
का उपयोग कर इन तिथियों के बीच के वर्षों की संख्या खोज पाए, कहो

क्या कोई फ़ंक्शन है जिसका उपयोग मैं फ़्लोटिंग पॉइंट उत्तर today - ref_date = 5.2y प्राप्त करने के लिए कर सकता हूं, उदाहरण के लिए?

उत्तर

23

हाँ, जाहिर है, का उपयोग एक के रूप में संख्यात्मक साथ difftime():

R> as.numeric(difftime(as.Date("2003-04-05"), as.Date("2001-01-01"), 
+      unit="weeks"))/52.25 
[1] 2.2529 
R> 

ध्यान दें कि हम 52.25 द्वारा बढ़ाया सप्ताह के लिए स्विच करने के लिए वहाँ के रूप में गिनती वर्षों के के मामले में अस्पष्टता वहाँ का एक सा है की क्या ज़रूरत है - फरवरी 2 9 हर 4 साल के आसपास आता है लेकिन हर 100 वें आदि नहीं

तो आपको इसे परिभाषित करना होगा। difftime() सप्ताहों तक सभी समय इकाइयों को संभालता है। महीनों को गैर-स्थिर 'संख्या' के समान कारण के लिए नहीं किया जा सकता है। एक साल में सेकंड के

खोजने संख्या:

+0

धन्यवाद। मुझे लगता है कि मैं 365.25 से विभाजित कर सकता हूं और 'इकाई = सप्ताह" – moadeep

+1

छोड़ सकता हूं, आपको इसकी आवश्यकता है - बस इसे देखने के लिए खेलें। इकाई स्वतः समायोजित करती है, इसे एक से कम के डेल्टा के साथ आज़माएं, या यहां तक ​​कि 'POSIXct' ऑब्जेक्ट्स' (उदाहरण के लिए 'Sys.time() ') –

+0

और सप्ताह हमेशा एक ही संख्या में एक ही संख्या में हैं? – sop

-1

आप पहले से ही lubridate पैकेज का उपयोग कर रहे हैं, इसलिए आपको चल बिन्दु एक सरल चाल का उपयोग कर में वर्षों की संख्या प्राप्त कर सकते हैं

seconds_in_a_year <- as.integer((seconds(ymd("2010-01-01")) - seconds(ymd("2009-01-01")))) 

अब सेकंड की संख्या प्राप्त 2 तिथियों के बीच आप चल अंक में वर्षों की संख्या के लिए

seconds_between_dates <- as.integer(seconds(date1) - seconds(date2)) 

अपने अंतिम जवाब की इच्छा

हो जाएगा
years_between_dates <- seconds_between_dates/seconds_in_a_year 
1

आपके प्रश्न का सही उत्तर नहीं है, लेकिन कुछ स्थितियों में Dirk Eddelbuettel का उत्तर छोटी त्रुटियों का उत्पादन कर सकता है।

कृपया, निम्न उदाहरण पर विचार करें:

as.numeric(difftime(as.Date("2012-03-01"), as.Date("2017-03-01"), unit="weeks"))/52.25 
[1] -4.992481 

सही जवाब यहाँ कम से कम 5 वर्ष होनी चाहिए।

निम्नलिखित समारोह (lubridate पैकेज का उपयोग) दो तिथियों के बीच पूर्ण वर्ष की एक संख्या की गणना होगी:

# Function to calculate an exact full number of years between two dates 
year.diff <- function(firstDate, secondDate) { 
    yearsdiff <- year(secondDate) - year(firstDate) 
    monthsdiff <- month(secondDate) - month(firstDate) 
    daysdiff <- day(secondDate) - day(firstDate) 

    if ((monthsdiff < 0) | (monthsdiff == 0 & daysdiff < 0)) { 
    yearsdiff <- yearsdiff - 1 
    } 

    yearsdiff 
} 

आप कैसे आप दिनों की संख्या को परिभाषित के आधार पर एक आंशिक भाग गणना करने के लिए संशोधित कर सकते हैं अंतिम (समाप्त नहीं) वर्ष में।

1

lubridate पैकेज निर्मित एक समारोह, TIME_LENGTH है, जो इस कार्य को करने में मदद कर सकते हैं।lubridate पैकेज के लिए

time_length(difftime(as.Date("2003-04-05"), as.Date("2001-01-01")), "years") 
[1] 2.257534 

time_length(difftime(as.Date("2017-03-01"), as.Date("2012-03-01")),"years") 
[1] 5.00274 

प्रलेखन here पाया जा सकता है।

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