2015-06-04 11 views
8

मैं निम्नलिखित समस्या: एक data.table में अंतराल गैर-अतिव्यापी, अंतराल के बीच अंतराल को रिपोर्ट का एक सेट दिया।का उपयोग कर अंतराल के बीच अंतराल को ढूँढना data.table

मैं एक का नेतृत्व समारोह या अंतराल समारोह की कमी के कारण एसक्यूएल में इस बार लागू किया है, फिर भी मैं data.table के साथ संघर्ष कर रहा हूँ। पूर्णता के लिए, मेरे पास here SQL कोड है। मुझे पता है कि कार्यक्षमता डेटा.table संस्करण 1.9.5 में लागू की गई है। changelog के अनुसार। तो क्या यह संभवतः विलय या लीग फ़ंक्शन के बिना विलय के बिना डेटा.table के साथ संभव है?

सिद्धांत रूप में, मैं मर्ज के उपयोग करते हुए (उर्फ मिलती है) के रूप में लंबे समय के रूप प्रदर्शन कष्ट नहीं होता है के खिलाफ पूरी तरह से नहीं कर रहा हूँ। मुझे लगता है कि इसका एक आसान कार्यान्वयन है, लेकिन मैं यह नहीं समझ सकता कि पिछले अंतराल को "मेरी" अंतराल तालिका के प्रारंभिक समय के रूप में कैसे प्राप्त किया जाए।

उदाहरण के लिए:

ID    stime    etime 
1 2014-01-15 10:30:00 2014-01-15 11:00:00 
1 2014-01-15 12:00:00 2014-01-16 11:30:00 
2 2014-01-15 11:00:00 2014-01-15 12:30:00 
2 2014-01-15 12:45:00 2014-01-15 13:30:00 

नोटिस::

# The numbers represent seconds from 1970-01-01 01:00:01 
dat <- structure(
    list(ID = c(1L, 1L, 1L, 2L, 2L, 2L), 
     stime = structure(c(as.POSIXct("2014-01-15 08:00:00"), 
          as.POSIXct("2014-01-15 11:00:00"), 
          as.POSIXct("2014-01-16 11:30:00"), 
          as.POSIXct("2014-01-15 09:30:00"), 
          as.POSIXct("2014-01-15 12:30:00"), 
          as.POSIXct("2014-01-15 13:30:00") 
          ), 
         class = c("POSIXct", "POSIXt"), tzone = ""), 
     etime = structure(c(as.POSIXct("2014-01-15 10:30:00"), 
          as.POSIXct("2014-01-15 12:00:00"), 
          as.POSIXct("2014-01-16 13:00:00"), 
          as.POSIXct("2014-01-15 11:00:00"), 
          as.POSIXct("2014-01-15 12:45:00"), 
          as.POSIXct("2014-01-15 14:30:00") 
          ), 
         class = c("POSIXct", "POSIXt"), tzone = "") 
), 
    .Names = c("ID", "stime", "etime"), 
    sorted = c("ID", "stime", "etime"), 
    class = c("data.table", "data.frame"), 
    row.names = c(NA,-6L) 
) 

dat <- data.table(dat) 

इस में जो परिणाम अंतराल दिन भर में समान रूप रिपोर्ट कर रहे हैं।

+2

तुम यहाँ एक पंक्ति याद आ रही नहीं कर रहे हैं या मैं कुछ याद कर रहा हूँ? –

+3

ओर ध्यान दें: 'Dat <- data.table (डीएटी)' स्मृति की बर्बादी .. का उपयोग है 'setDT (डीएटी)' बजाय। – Arun

+2

मुझे लगता है कि यह अपने पिछले प्रश्न: – Arun

उत्तर

5

डेविड के जवाब पर एक बदलाव की संभावना थोड़ा कम कुशल, लेकिन सरल बाहर टाइप करने के लिए:

setkey(dat, stime)[, .(stime=etime[-.N], etime=stime[-1]), by=ID] 

का उत्पादन:

ID    stime    etime 
1: 1 2014-01-15 10:30:00 2014-01-15 11:00:00 
2: 1 2014-01-15 12:00:00 2014-01-16 11:30:00 
3: 2 2014-01-15 11:00:00 2014-01-15 12:30:00 
4: 2 2014-01-15 12:45:00 2014-01-15 13:30:00 

setkey बस सुनिश्चित करें कि तालिका सॉर्ट हो जाता है बनाने के लिए है समय से।

5

यदि मुझे कुछ याद नहीं आ रहा है, तो आप अपने वांछित आउटपुट में एक पंक्ति खो रहे हैं, इसलिए आपके द्वारा उल्लेखित डेवेल संस्करण से shift का उपयोग करने का मेरा प्रयास यहां दिया गया है।

library(data.table) ## v >= 1.9.5 
indx <- dat[, .I[-.N], by = ID]$V1 
dat[, .(ID, stimes = etime, etime = shift(stime, type = "lead"))][indx] 
res 
# ID    stime    etime 
# 1: 1 2014-01-15 10:30:00 2014-01-15 11:00:00 
# 2: 1 2014-01-15 12:00:00 2014-01-16 11:30:00 
# 3: 2 2014-01-15 11:00:00 2014-01-15 12:30:00 
# 4: 2 2014-01-15 12:45:00 2014-01-15 13:30:00 
संबंधित मुद्दे