2015-01-09 4 views
6

कोई संख्यात्मक प्रकारों से भी आर में तारीखों का निर्माण कर सकता है, यहां तक ​​कि आंशिक मूल्य भी। यह बहुत आम नहीं है, लेकिन उदाहरण के लिए यह औसत होता है जब औसत तिथियां होती हैं। दुर्भाग्य से, वे तोड़ने के लिए splitक्यों विभाजित कोर आर में पूर्णांक को डबल करता है और क्या कोई कामकाज

> as.Date(-1, origin = "1970-01-01") 
[1] "1969-12-31" 
> as.Date(-1.0001, origin = "1970-01-01") 
[1] "1969-12-30" 
> split(as.Date(-1, origin = "1970-01-01"), 1)[[1]] 
[1] "1969-12-31" 
> split(as.Date(-1.0001, origin = "1970-01-01"), 1)[[1]] 
[1] "1969-12-31" #this is wrong 
> unclass(split(as.Date(-1, origin = "1970-01-01"), 1)[[1]]) 
[1] -1 
> unclass(split(as.Date(-1.0001, origin = "1970-01-01"), 1)[[1]]) 
[1] -1 #this is "why" 

तो दो तिथियों कि अलग थे एक split द्वारा बराबर बना रहे हैं लगता है। क्या लोग सहमत हैं कि यह एक बग है या क्या मुझे गहरा कारण याद आ रहा है? कोई कामकाज? धन्यवाद

+0

स्ट्रॉमैन वर्कअराउंड: 'लापरवाही (विभाजित (as.character (तिथियां), अनुक्रमणिका), as.Date) '। तारीख को संरक्षित करता है लेकिन अंतर्निहित प्रतिनिधित्व को बदलता है। कुछ मामलों में धीमी गति से 'लापता' की आवश्यकता है। – piccolbo

उत्तर

6

जो भी कारण, split.Date पूर्णांक तक Date इनपुट coerces:,

> split.Date 
function (x, f, drop = FALSE, ...) 
{ 
    y <- split.default(as.integer(x), f, drop = drop) 
    for (i in seq_along(y)) class(y[[i]]) <- "Date" 
    y 
} 
<bytecode: 0x2effb98> 
<environment: namespace:base> 

यह न्यूनतम समारोह और प्रलेखन के बीच एक नाकामयाबी पर है के बाद से ?Date कहते हैं, "तारीख एक पूर्णांक होना चाहिए, लेकिन यह आंतरिक प्रतिनिधित्व में लागू नहीं है। " कुछ इसे एक बग मान सकते हैं। मुझे यकीन नहीं है।

आप split.default पर कॉल करके सीधे इससे बच सकते हैं।

> split.default(as.Date(-1.0001, origin = "1970-01-01"), 1)[[1]] 
[1] "1969-12-30" 
+0

कोई रास्ता नहीं !! ऐसा लगता है कि इस विधि को लिखने का एकमात्र लक्ष्य इस बग को पेश करना था। डिफ़ॉल्ट काम ठीक है। धन्यवाद – piccolbo

+1

@piccolbo 'svn annotate src/library/base/r/date.R' मुझे परिचय के लिए प्रेरणा के साथ https://stat.ethz.ch/pipermail/r-devel/2008-July/050134.html पर ले जाएं प्रदर्शन होने के नाते (1e6 तत्वों के वैक्टरों के लिए अभी भी पर्याप्त)। हालांकि स्पष्ट रूप से सही है और अधिक महत्वपूर्ण है। –

+0

धन्यवाद @ मार्टिन मॉर्गन, जो अधिक दर्द से बचा है। ऐसा लगता है कि लूप असाइनमेंट में अंतिम समय से पहले लाइन को split.default द्वारा खर्च किया जाता है। यकीन नहीं है कि यह इतना धीमा क्यों है। समझौता as.Nteger को as.numeric के साथ बदल सकता है, लेकिन इससे डबल डेट्स का उपयोग अधिक आम हो जाएगा, और जैसा कि आपने कहा है कि यह iffy सबसे अच्छा है। बेहतर समझौता x = हो सकता है (if.double (x)) x else as.integer (x)। बग रिपोर्टिंग के अपने रिकॉर्ड को देखते हुए, मैं इसे सबमिट करने के लिए इसे दूसरों को छोड़ दूंगा। – piccolbo

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