2012-07-20 16 views
17

data.table पैकेज का उपयोग करते समय, मुझे कुछ अनिश्चितता है जब मुझे setkey() की आवश्यकता होती है। उदाहरण के लिए, ऑपरेटर का उपयोग by विकल्प के साथ करते समय, चीजें अभी भी बहुत तेज लगती हैं भले ही मैंने कोई कुंजी सेट नहीं की है। setkey() आवश्यक होने पर कोई और स्पष्ट हो सकता है और जब यह नहीं है? और := को by के साथ कॉल करने से पहले आवश्यक नहीं है तो data.table पैकेज इतनी तेजी से कैसे है क्योंकि संभावित रूप से इसे मानक data.frame आर में एक बाइनरी के बजाय अनुक्रमिक खोज करके करना है क्योंकि यह नहीं करता है पता है कि मेरा data.table वास्तव में by पर तर्क द्वारा क्रमबद्ध किया गया है।सेटकी और: = ऑपरेटर, डेटाटेबल, आर

धन्यवाद

उत्तर

18

इन 2 पूछे जाने वाले प्रश्न करीब लग रहे हैं:

3,2 मैं एक बड़ी मेज पर एक कुंजी नहीं है, लेकिन समूह अभी भी बहुत जल्दी है। ऐसा क्यों है?
data.table रेडिक्स सॉर्टिंग का उपयोग करता है। यह अन्य प्रकार के एल्गोरिदम की तुलना में तेजी से तेज़ है। रेडिक्स विशेष रूप से केवल पूर्णांक के लिए है, ?base::sort.list(x,method="radix") देखें। यह भी एक कारण है कि setkey त्वरित है। जब कोई कुंजी सेट नहीं होती है, या हम उस कुंजी से अलग क्रम में समूह करते हैं, तो हम इसे एक विज्ञापन कहते हैं।

3.3 कुंजी में कॉलम द्वारा समूह द्वारा विज्ञापन की तुलना में तेजी से समूह क्यों किया जाता है?
क्योंकि प्रत्येक समूह रैम में सटा हुआ है, जिससे कम से कम पेज को हासिल करेगा, और स्मृति थोक (सी में memcpy) में कॉपी किया जा सकता है बजाय सी

में पाशन क्या यह नहीं कहता है, और शायद चाहिए ऐसा करें कि आपको एक बहुत बड़े डेटासेट की आवश्यकता है, जहां प्रत्येक समूह भी बहुत बड़ा है, इससे पहले कि आप कुंजी के द्वारा अंतर और विज्ञापन के बीच अंतर देखें। प्रत्येक 100 एमबी के 100 समूह (एक 10 जीबी डेटाटेबल) जैसे 1e8 पंक्तियों और 13 कॉलम की तरह कुछ। अन्यथा, setkey पहले की आवश्यकता नहीं है, खासकर जब से यह कठिन हो सकता है।

+1

शानदार, धन्यवाद! एफएक्यू के माध्यम से खोद रहा था और इसे याद किया होगा। – Alex

+0

क्या 'ad hoc by' तेजी से है क्योंकि यह रेडिक्स सॉर्टिंग का भी उपयोग करता है? – colinfang

+1

@colinfang उस प्रश्न का उत्तर देने में मुश्किल है क्योंकि इसमें कई सुविधाएं शामिल हैं। क्वेरी और डेटा के अनुसार कारण अलग-अलग हैं। विज्ञापन 'द्वारा' पूर्णांक कॉलम के लिए समूहों को खोजने के लिए रेडिक्स सॉर्टिंग का उपयोग करता है, इसलिए यह प्रकार पर निर्भर करता है और कितने कॉलम 'by'-ed' होते हैं। फिर एक बार यह समूह मिल गया है, एक कारण समूहीकरण तेजी से है क्योंकि स्मृति को एक बार ऊपर के सबसे बड़े समूह के लिए आवंटित किया जाता है जिसे फिर सभी समूहों के लिए पुन: उपयोग किया जाता है। और केवल 'जे' द्वारा आवश्यक कॉलम के लिए। एफएक्यू देखें 3.1। 'Verbose = TRUE' मोड आज़माएं क्योंकि यह बताता है कि समूहों को खोजने में कितना समय व्यतीत होता है (इंक रेडिक्स सॉर्ट) बनाम उन्हें बनाते हैं। –

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