2012-07-05 12 views
5

से निकटतम समय पर मामला शामिल नहीं है, तो मैं शामिल होने के दिनांक से दो data.table एस में शामिल होना चाहता हूं।सटीक तिथि पर डेटाटेबल में शामिल हों या यदि

ठीक है, कभी-कभी मेरे पास सटीक मिलान नहीं था और इस मामले में मैं निकटतम कम तारीख खोजना चाहता हूं। मेरे probleme बहुत एसक्यूएल के बारे में इस पोस्ट के समान है: SQL Join on Nearest less than date

मैं जानता हूँ कि data.table वाक्य रचना एसक्यूएल के अनुरूप है, लेकिन मैं इस कोड करने के लिए नहीं कर सकते। सही वाक्यविन्यास क्या है?

एक सरल उदाहरण:

Dt1 
    date  x 
1/26/2010 - 10 
1/25/2010 - 9 
1/24/2010 - 9 
1/22/2010 - 7  
1/19/2010 - 11 

Dt2 
    date 
1/26/2010 
1/23/2010 
1/20/2010 

उत्पादन

date  x 
1/26/2010 - 10 
1/23/2010 - 7 
1/20/2010 - 11 

अग्रिम धन्यवाद।

उत्तर

6

ये रहा:

library(data.table) 

डेटा बनाएं:

Dt1 <- read.table(text=" 
date  x 
1/26/2010, 10 
1/25/2010, 9 
1/24/2010, 9 
1/22/2010, 7  
1/19/2010, 11", header=TRUE, stringsAsFactors=FALSE) 

Dt2 <- read.table(text=" 
date 
1/26/2010 
1/23/2010 
1/20/2010", header=TRUE, stringsAsFactors=FALSE) 

data.table में बदलें, खजूर के तार कनवर्ट करते हैं, और सेट data.table कुंजी:

Dt1 <- data.table(Dt1) 
Dt2 <- data.table(Dt2) 

Dt1[, date:=as.Date(date, format=("%m/%d/%Y"))] 
Dt2[, date:=as.Date(date, format=("%m/%d/%Y"))] 

setkey(Dt1, date) 
setkey(Dt2, date) 

शामिल हों टेबल, roll=TRUE का उपयोग कर:

Dt1[Dt2, roll=TRUE] 

      date x 
[1,] 2010-01-20 11 
[2,] 2010-01-23 7 
[3,] 2010-01-26 10 
+3

@mat मुझे खुशी है कि इस उत्तर ने आपकी मदद की। भविष्य के संदर्भ के लिए: यदि आप अपने प्रश्न में पुनरुत्पादित कोड प्रदान करते हैं तो यह बहुत मदद करता है - इससे लोगों को जवाब देने के लिए प्रोत्साहित किया जाता है, क्योंकि इसका मतलब है कि हमें आपकी समस्या को खरोंच से फिर से बनाने की ज़रूरत नहीं है, जैसा कि मैंने यहां किया है। साथ ही, अगर आपने त्रुटि संदेश के साथ अपना कोड पोस्ट किया है, तो हम समझा सकते थे कि त्रुटि संदेश क्यों होता है और आपको इसे ठीक करने के बारे में कैसे जाना चाहिए। – Andrie

+1

आपके उत्तरों के लिए एंड्री और मैथ्यू धन्यवाद! जब मैंने प्रलेखन पढ़ा तो मैंने इस पैरामीटर को "रोल" देखा था। मैंने इसे पहले करने की कोशिश की लेकिन यह काम नहीं करता है, मेरे पास यह आउटपुट एररूर डान्स '[.data.table' (पिक्सेल, ट्रेप, रोल = टी) था: कारक कॉल i.date पर रोल में शामिल होने का प्रयास करना। केवल पूर्णांक, डबल या वर्ण कॉलम रोल हो सकते हैं। मुझे डेट प्रारूप की समस्या थी। अब मैं तारीख प्रारूप के साथ अपने समस्या समझौते को समझता हूं। अधिक समय पर बहुत बहुत धन्यवाद। – mat

+0

मैंने ध्यान दिया कि भविष्य के लिए। धन्यवाद – mat

2
?data.table     # search for the `roll` argument 
example(data.table)   # search for the example using roll=TRUE 
vignette("datatable-intro") # see section "3: Fast time series join" 
vignette("datatable-faq") # see FAQs 2.16 and 2.20 

यह data.table की मुख्य विशेषताओं में से एक है। चूंकि पंक्तियों का आदेश दिया जाता है (एसक्यूएल के विपरीत) यह ऑपरेशन सरल और बहुत तेज़ है। एसक्यूएल स्वाभाविक रूप से अनियंत्रित है इसलिए आपको इस कार्य को करने के लिए स्वयं से जुड़ने और 'आदेश' की आवश्यकता है। यह एसक्यूएल में किया जा सकता है और यह काम करता है लेकिन यह धीमा हो सकता है और अधिक कोड की आवश्यकता है। चूंकि एसक्यूएल एक पंक्ति स्टोर है, यहां तक ​​कि स्मृति में एसक्यूएल भी है, यह रैम से एल 2 कैश में पृष्ठ लाने के द्वारा निर्धारित निचला बाध्य है। data.table उस निचले बाउंड से नीचे है क्योंकि यह एक कॉलम स्टोर है।

2 विगेट्स homepage पर भी हैं।

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