2014-12-15 6 views
15

नीचे (सीधा sqldf उपयोग करते हुए) ऐसा कैसे करें data.table का उपयोग करने और पाने ठीक उसी परिणाम:डेटा.table का उपयोग कर तिथि सीमाओं में शामिल होने के लिए कैसे करें?

library(data.table) 

whatWasMeasured <- data.table(start=as.POSIXct(seq(1, 1000, 100), 
    origin="1970-01-01 00:00:00"), 
    end=as.POSIXct(seq(10, 1000, 100), origin="1970-01-01 00:00:00"), 
    x=1:10, 
    y=letters[1:10]) 

measurments <- data.table(time=as.POSIXct(seq(1, 2000, 1), 
    origin="1970-01-01 00:00:00"), 
    temp=runif(2000, 10, 100)) 

## Alternative short names for data.tables 
dt1 <- whatWasMeasured 
dt2 <- measurments 

## Straightforward with sqldf  
library(sqldf) 

sqldf("select * from measurments m, whatWasMeasured wwm 
where m.time between wwm.start and wwm.end") 
+1

क्या इससे आपकी समस्या हल हो जाती है? http://stackoverflow.com/questions/5123197/matching-time-a-time-in-the-interval-between-a-start-and-end-time –

+0

@ डेविड रॉबिन्सन धन्यवाद। मैंने वास्तव में यह प्रश्न और उत्तर देखा है, लेकिन दुर्भाग्य से मेरा डेटा वॉल्यूम बड़ा है और वास्तव में एक तेज़ डेटा.table समाधान पसंद करेगा ... – Samo

+0

मुझे पता है कि यह थोड़ा अपरिवर्तित है, लेकिन क्या मैं अकेला हूं-दिसंबर -31-19 6 9 खजूर? क्या यह जनवरी -1-19 70 नहीं होना चाहिए? –

उत्तर

17

आप foverlaps() समारोह जो लागू करता है कुशलता से अंतराल से अधिक मिलती उपयोग कर सकते हैं। आपके मामले में, हमें measurments के लिए बस एक डमी कॉलम चाहिए।

नोट 1: - साथ foverlaps() वहाँ तय किया गया है एक बग के रूप में v1.9.5 आप data.table के विकास के संस्करण को स्थापित करना चाहिए। आप स्थापना निर्देश here पा सकते हैं।

नोट 2: मैं फोन करता हूँ whatWasMeasured = dt1 और measurments = सुविधा के लिए dt2 यहाँ।

require(data.table) ## 1.9.5+ 
dt2[, dummy := time] 

setkey(dt1, start, end) 
ans = foverlaps(dt2, dt1, by.x=c("time", "dummy"), nomatch=0L)[, dummy := NULL] 

अधिक जानकारी और this post एक प्रदर्शन की तुलना के लिए के लिए ?foverlaps देखें।

+0

क्या कोई तरीका है कि हम% स्टेटमेंट के बीच किसी प्रकार के% से दूर हो सकते हैं? मुझे उम्मीद थी कि काम करने के लिए dt2 [% dt1 [, सूची (प्रारंभ, अंत)] के बीच समय% प्राप्त करना मुश्किल था। –

+0

@ सेर्बान तानासा, [पोस्ट] पर एक नज़र डालें (http://stackoverflow.com/a/25655497/559784) मैंने अपने जवाब में लिंक किया है। यह 'बीच' का उपयोग करके समाधान के प्रदर्शन की तुलना करता है। – Arun

+0

आपके उत्तर के लिए धन्यवाद। महान। यह काम करता हैं। बहुत तेज़। एकमात्र मामूली मुद्दा यह है कि इसे प्रारंभ या समाप्ति या समय के लिए गुम मूल्य पसंद नहीं है। हो सकता है कि एक na.rm हैंडलिंग अच्छा लगेगा। साथ ही, वास्तविक डेटा पर इस अभ्यास को करने के दौरान, मुझे अंतिम परिणाम में "प्रारंभ" और "अंत" नामक दो अतिरिक्त अवांछित कॉलम मिलते हैं, जिनमें न तो इनपुट डेटा होता है और न ही चाबियाँ या कुछ भी नाम हैं ... – Samo

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