कोई सीधा / सरल उत्तर नहीं है क्योंकि इन दोनों पैकेजों के दर्शन कुछ पहलुओं में भिन्न हैं। तो कुछ समझौते अपरिहार्य हैं। यहां कुछ चिंताओं के बारे में बताया गया है, जिन पर आपको ध्यान देना चाहिए।
संचालन i
(== filter()
और slice()
dplyr में)
मान लें DT
कि 10 कॉलम हैं। इन डेटा पर विचार करें। अभिव्यक्ति:
DT[a > 1, .N]
DT[a > 1, mean(b), by=.(c, d)]
(1) DT
जहां कॉलम में पंक्तियों की संख्या देता है a > 1
। (2) के रूप में (1) में एक ही अभिव्यक्ति के लिए mean(b)
समूहीकृत रिटर्न ।c,d
i
आमतौर पर इस्तेमाल किए जाने वाले dplyr
भाव होंगे:
DT %>% filter(a > 1) %>% summarise(n())
DT %>% filter(a > 1) %>% group_by(c, d) %>% summarise(mean(b))
स्पष्ट रूप से, डेटाटेबल कोड छोटे होते हैं। इसके अलावा वे भी अधिक स्मृति कुशल 1 हैं । क्यों? क्योंकि (3) और (4) दोनों में, पहले सभी 10 कॉलमों के लिए पंक्तियों कोfilter()
लौटाता है , जब (3) हमें बस पंक्तियों की संख्या की आवश्यकता होती है, और (4) हमें बस क्रमिक संचालन के लिए कॉलमों की आवश्यकता होती है । इसे दूर करने के लिए, हमें एप्रीरी को कॉलम करना होगा:b, c, d
select()
DT %>% select(a) %>% filter(a > 1) %>% summarise(n())
DT %>% select(a,b,c,d) %>% filter(a > 1) %>% group_by(c,d) %>% summarise(mean(b))
दो पैकेजों के बीच एक प्रमुख दार्शनिक अंतर को उजागर करना आवश्यक है:
में data.table
, हम इन संबंधित कार्यों को एक साथ रखना पसंद करते हैं, और यह j-expression
(एक ही फ़ंक्शन कॉल से) को देखने की अनुमति देता है और महसूस करता है कि (1) में किसी भी कॉलम की कोई आवश्यकता नहीं है। अभिव्यक्ति की i
गणना हो जाती है, और .N
केवल उस तार्किक वेक्टर का योग होता है जो पंक्तियों की संख्या देता है; पूरे सबसेट का एहसास कभी नहीं होता है। (2) b,c,d
में, उप-कॉलम में सिर्फ कॉलम को भौतिक किया जाता है, अन्य स्तंभों को अनदेखा किया जाता है।
लेकिन dplyr
, दर्शन में एक कार्य को अच्छी तरह से ठीक करना है । यह बताने का कोई तरीका नहीं है (कम से कम वर्तमान में) यह बताने का कोई तरीका नहीं है कि ऑपरेशन के बाद filter()
उन सभी कॉलमों की आवश्यकता है जिन्हें हमने फ़िल्टर किया था। यदि आप ऐसे कार्यों को कुशलतापूर्वक करना चाहते हैं तो आपको आगे सोचने की आवश्यकता होगी। मैं व्यक्तिगत रूप से इसे इस मामले में प्रति-संवेदनशील मानता हूं।
ध्यान दें कि (5) और (6) में, हम अभी भी कॉलम को सब्मिट a
करते हैं, जिसकी हमें आवश्यकता नहीं है। लेकिन मुझे यकीन नहीं है कि इससे कैसे बचा जाए। यदि filter()
फ़ंक्शन के पास लौटने के लिए कॉलम का चयन करने का तर्क था, तो हम इस मुद्दे से बच सकते हैं, लेकिन फिर फ़ंक्शन केवल एक कार्य नहीं करेगा (जो कि एक dplyr डिजाइन विकल्प भी है)।
संदर्भ द्वारा उप-असाइन करें
dplyr संदर्भ द्वारा कभी अद्यतन नहीं होगा । यह दो पैकेजों के बीच एक और बड़ा (दार्शनिक) अंतर है।
उदाहरण के लिए, data.table में आप कर सकते हैं:
DT[a %in% some_vals, a := NA]
जो उन पंक्तियों पर a
संदर्भ द्वारा कॉलम अद्यतन करता है जो स्थिति को संतुष्ट करते हैं। इस समय पूरी तरह से एक नया कॉलम जोड़ने के लिए आंतरिक रूप से संपूर्ण डेटा को कॉपी करता है। @ ब्रॉडीजी ने पहले ही अपने जवाब में इसका उल्लेख किया।
लेकिन FR # 617 लागू होने पर गहरी प्रति को उथली प्रति से बदला जा सकता है। इसके अलावा प्रासंगिक: dplyr: एफआर # 614 । ध्यान दें कि फिर भी, आपके द्वारा संशोधित किया गया कॉलम हमेशा कॉपी किया जाएगा (इसलिए टैड धीमी / कम मेमोरी कुशल)। संदर्भ द्वारा कॉलम अपडेट करने का कोई तरीका नहीं होगा।
अन्य कार्यशीलता
Data.table में, आप शामिल होने के दौरान एकत्र कर सकते हैं, और यह समझने के लिए अधिक सीधा है और मेमोरी कुशल है क्योंकि इंटरमीडिएट जॉइन परिणाम कभी भी भौतिक नहीं होता है। एक उदाहरण के लिए इस पोस्ट की जाँच करें । आप (समय पर?) नहीं कर सकते कि dplyr के data.table / data.frame वाक्यविन्यास का उपयोग कर।
data.table का रोलिंग जॉइन फीचर dplyr के सिंटैक्स में भी समर्थित नहीं है।
हमने हाल ही में डेटाटैब पर ओवरलैप जोड़ दिए हैं। अंतराल रेंज ( यहां एक उदाहरण ) में शामिल होने के लिए , जो foverlaps()
इस समय एक अलग फ़ंक्शन है , और इसलिए इसे पाइप ऑपरेटरों (मैग्रीट्र / पाइपआर के साथ इस्तेमाल किया जा सकता है? - कभी भी इसे खुद करने की कोशिश नहीं की गई)।
लेकिन आखिरकार, हमारा लक्ष्य इसे एकीकृत करना है [.data.table
ताकि हम अन्य सुविधाओं जैसे कि समूह बनाना, जुड़ते समय एकत्र करना आदि की कटाई कर सकें .. जिसमें ऊपर उल्लिखित समान सीमाएं होंगी।
1.9.4 के बाद से, डेटाटेबल नियमित आर सिंटैक्स पर तेजी से द्विआधारी खोज आधारित सबसेट के लिए माध्यमिक कुंजी का उपयोग करके स्वचालित अनुक्रमण को लागू करता है। Ex: DT[x == 1]
और DT[x %in% some_vals]
पहले रन पर स्वचालित रूप से एक इंडेक्स बनाएगा, जिसे बाद में बाइनरी सर्च का उपयोग करते हुए एक ही कॉलम से फास्ट सब्सेट पर क्रमिक सबसेट पर उपयोग किया जाएगा। यह सुविधा विकसित होती रहेगी। इस सुविधा के एक संक्षिप्त अवलोकन के लिए इस जिस्ट की जाँच करें ।
जिस तरह filter()
से data.tables के लिए कार्यान्वित किया जाता है, वह इस सुविधा का लाभ नहीं उठाता है।
एक dplyr विशेषता यह है कि यह उसी सिंटैक्स का उपयोग करके डेटाबेस को इंटरफ़ेस भी प्रदान करता है , जो डेटाटेबल फिलहाल नहीं है।
तो, आपको इन (और शायद अन्य बिंदुओं) में तौलना होगा और यह तय करना होगा कि ये व्यापार-बंद आपको स्वीकार्य हैं या नहीं।
HTH
(1) ध्यान दें कि मेमोरी कुशल होना सीधे गति को प्रभावित करता है (विशेषकर डेटा बड़ा हो जाता है), क्योंकि ज्यादातर मामलों में अड़चन मुख्य मेमोरी से कैश पर डेटा को स्थानांतरित कर रही है (और जितना संभव हो उतना कैश में डेटा का उपयोग करना - कैश मिस को कम करना - ताकि मुख्य मेमोरी तक पहुंच कम हो सके)। यहां विवरण में नहीं जा रहा है।
dplyr
डेटा टेबल के लिए तरीके हैं , लेकिन डेटा टेबल के अपने स्वयं के तुलनीय तरीके भी हैं