2012-03-28 8 views
16

data.table पैकेज एसक्यूएल के समान टेबल हैंडलिंग विधियों को प्रदान करता है। यदि किसी तालिका में कुंजी है, तो उस कुंजी में एक या अधिक कॉलम होते हैं। लेकिन एक तालिका में एक से अधिक कुंजी नहीं हो सकती है, क्योंकि इसे एक ही समय में दो अलग-अलग तरीकों से हल नहीं किया जा सकता है।एसक्यूएल अनुवाद करना आरटीटीटीई सिंटैक्स

इस उदाहरण में, X और Ydata.table एस एक एकल कुंजी कॉलम "आईडी" के साथ हैं; Y में एक गैर-कुंजी कॉलम "x_id" भी है।

X <- data.table(id = 1:5, a=4:8,key="id") 
    Y <- data.table(id = c(1,1, 3,5,7), x_id=c(1,4:1), key="id") 

निम्न सिंटैक्स अपनी चाबी पर तालिकाओं में शामिल हो जाएगा:

X[Y] 

मैं कैसे data.table कोड के लिए निम्न SQL सिंटैक्स अनुवाद कर सकते हैं?

select * from X join Y on X.id = Y.x_id; 

करीबी है कि मैं मिल गया है है:

Y[X,list(id, x_id),by = x_id,nomatch=0] 

हालांकि, इस एसक्यूएल बयान के रूप में एक ही भीतरी में शामिल होने नहीं करता है।


यहाँ एक और अधिक स्पष्ट उदाहरण है, जिसमें विदेशी कुंजी y_id है है, और हम Y2 जहां X2$y_id = Y2$id के मूल्यों को देखने के लिए में शामिल होने के लिए चाहते हैं।

X2 <- data.table(id = 1:5, y_id = c(1,1,2,2,2), key="id") 
    Y2 <- data.table(id = 1:5, b = letters[1:5], key="id") 

मैं तालिका का उत्पादन करना चाहते हैं:

id y_id b 
    1  1 "a" 
    2  1 "a" 
    3  2 "b" 
    4  2 "b" 
    5  2 "b" 

क्या निम्नलिखित kludge द्वारा किया जाता है के समान:

> merge(data.frame(X2), data.frame(Y2), by.x = "y_id", by.y = "id") 
    y_id id b 
1 1 1 a 
2 1 2 a 
3 2 3 b 
4 2 4 b 
5 2 5 b 

हालांकि, मैं यह कर जब:

X2[Y2, 1:2,by = y_id] 

मुझे वांछित परिणाम नहीं मिलते हैं:

y_id V1 
[1,] 1 1 
[2,] 1 2 
[3,] 2 1 
[4,] 2 2 
+2

आप अस्थायी रूप से 'बदल सकते हैं X2' कुंजी और उन्हें स्थापित करने के लिए' "y_id" '; फिर दिशा के आधार पर 'वाई 2 [एक्स 2] '(या' एक्स 2 [वाई 2] 'में सामान्य जुड़ें) और फिर' X2' की पिछली कुंजी को पुनर्स्थापित करें। – digEmAll

+0

@digEmAll जो उपयोगी है, मैंने सोचा था कि 'by' तर्क क्या था ... लेकिन क्या इसे एकाधिक (> 2) तालिका में लागू किया जा सकता है जहां लक्ष्य (बाएं) तालिका में> 1 विदेशी कुंजी है? –

+0

मैं @digEmAll से सहमत हूं: 'setkey (X2, y_id) 'के बाद' X2 [Y2, nomatch = 0]' आपको अपने उदाहरण के लिए आवश्यक है। और यह कई चाबियों के साथ भी काम करना चाहिए। हालांकि, मैं एसक्यूएल में विदेशी कुंजी वाक्यविन्यास से वास्तव में परिचित नहीं हूं, इसलिए यदि आप अधिक चाबियों से जूझ रहे हैं, तो क्या आप अपना उदाहरण बढ़ा सकते हैं? –

उत्तर

17

अच्छा सवाल।

जब i एक data.table है, x एक महत्वपूर्ण होना चाहिए: निम्नलिखित (वैसे दफन) ?data.table में ध्यान दें। ix में x में कुंजी और पंक्तियों का उपयोग करके x पर वापस आ गया है कि मैच लौटाया गया है। x की कुंजी में प्रत्येक कॉलम में i में प्रत्येक कॉलम के बीच एक इक्विटी-जॉइन किया जाता है। यह मैच संकलित सी इन ओ (लॉग एन) समय में एक बाइनरी खोज है। यदि i में x की कुंजी से कम कॉलम हैं तो x की कई पंक्तियां i की प्रत्येक पंक्ति से मेल खाती हैं। यदि i में x की कुंजी से अधिक कॉलम हैं, तो परिणाम में शामिल नहीं i के कॉलम परिणाम में शामिल नहीं हैं। यदि i में भी एक कुंजी है, तो यह i के प्रमुख स्तंभ हैं जिनका उपयोग x के मुख्य कॉलम से मेल खाने के लिए किया जाता है और दो तालिकाओं का एक बाइनरी विलय किया जाता है।

तो, यहां कुंजी यह है कि i को कुंजी नहीं होना चाहिए। केवल x कुंजी होना चाहिए।

X2 <- data.table(id = 11:15, y_id = c(14,14,11,12,12), key="id") 
    id y_id 
[1,] 11 14 
[2,] 12 14 
[3,] 13 11 
[4,] 14 12 
[5,] 15 12 
Y2 <- data.table(id = 11:15, b = letters[1:5], key="id") 
    id b 
[1,] 11 a 
[2,] 12 b 
[3,] 13 c 
[4,] 14 d 
[5,] 15 e 
Y2[J(X2$y_id)] # binary search for each item of (unsorted and unkeyed) i 
    id b 
[1,] 14 d 
[2,] 14 d 
[3,] 11 a 
[4,] 12 b 
[5,] 12 b 

या,

Y2[SJ(X2$y_id)] # binary merge of keyed i, see ?SJ 
    id b 
[1,] 11 a 
[2,] 12 b 
[3,] 12 b 
[4,] 14 d 
[5,] 14 d 

identical(Y2[J(X2$y_id)], Y2[X2$y_id]) 
[1] FALSE 
+0

धन्यवाद। लेकिन 'समान (वाई 2 [जे (एक्स 2 $ y_id)], वाई 2 [एक्स 2 $ y_id]) == सही', क्या कोई अंतर है? –

+0

@ डेविड ने इसे स्पष्ट करने के लिए उदाहरण डेटा बदल दिया है। पिछले उदाहरण डेटा में महत्वपूर्ण संख्याएं थीं जैसे कि पंक्ति संख्या यानी '1: 5'। –