अवलोकन
मैं अपेक्षाकृत परिचित हूं data.table, इतना नहीं dplyr। मैंने कुछ dplyrविगनेट्स और उदाहरणों के माध्यम से पढ़ा है जो SO पर पॉप अप हुए हैं, और अब तक मेरे निष्कर्ष यह हैं:
data.tableऔरdplyrगति में तुलनीय हैं, सिवाय इसके कि जब कई (अर्थात> 10-100K) समूह होते हैं, और कुछ अन्य परिस्थितियों में (पासवर्ड को देखें)dplyrअधिक सुलभ वाक्यविन्यास हैdplyrसार (या होगा) संभावित DB बातचीत- कुछ मामूली कार्यक्षमता अंतर हैं (नीचे "उदाहरण / उपयोग देखें")
मेरे दिमाग में 2. ज्यादा वजन नहीं है क्योंकि मैं इससे काफी परिचित data.tableहूं, हालांकि मैं समझता हूं कि दोनों के लिए नए उपयोगकर्ताओं के लिए यह एक बड़ा कारक होगा। मैं एक ऐसे तर्क से बचना चाहूंगा, जिसके बारे में अधिक सहज ज्ञान युक्त हो, क्योंकि इससे परिचित किसी के दृष्टिकोण से पूछे गए मेरे विशिष्ट प्रश्न के लिए अप्रासंगिक है data.table। मैं इस बारे में चर्चा करने से बचना चाहता हूं कि "अधिक सहज" कैसे तेजी से विश्लेषण की ओर जाता है (निश्चित रूप से सच है, लेकिन फिर से, न कि मैं यहां सबसे अधिक दिलचस्पी रखता हूं)।
सवाल
जो मैं जानना चाहता हूं वह है:
- क्या ऐसे विश्लेषणात्मक कार्य हैं जो पैकेज से परिचित लोगों के लिए एक या दूसरे पैकेज के साथ कोड करना बहुत आसान है (यानी कीस्ट्रोक्स के कुछ संयोजन आवश्यक बनाम गूढ़ता के आवश्यक स्तर, जहां प्रत्येक में से एक अच्छी बात है)।
- क्या ऐसे विश्लेषणात्मक कार्य हैं जो एक पैकेज बनाम दूसरे में अधिक कुशलतापूर्वक (अर्थात 2x से अधिक) किए जाते हैं।
हाल ही में एक एसओ प्रश्न मुझे इस बारे में थोड़ा और सोचने को मिला, क्योंकि उस समय तक मुझे नहीं लगता था कि dplyrजो मैं पहले से ही कर सकता हूं उससे बहुत अधिक की पेशकश करेगा data.table। यहाँ dplyrसमाधान (क्यू के अंत में डेटा) है:
dat %.%
group_by(name, job) %.%
filter(job != "Boss" | year == min(year)) %.%
mutate(cumu_job2 = cumsum(job2))
जो एक data.tableसमाधान में मेरे हैक प्रयास से बहुत बेहतर था । उस ने कहा, अच्छे data.tableसमाधान भी बहुत अच्छे हैं (धन्यवाद जीन-रॉबर्ट, अरुण, और यहां ध्यान दें कि मैंने कड़ाई से सबसे अधिक समाधान समाधान पर एकल कथन का समर्थन किया है:
setDT(dat)[,
.SD[job != "Boss" | year == min(year)][, cumjob := cumsum(job2)],
by=list(id, job)
]
उत्तरार्द्ध के लिए वाक्यविन्यास बहुत गूढ़ लग सकता है, लेकिन यह वास्तव में बहुत सरल है यदि आप उपयोग किए जाते हैं data.table(यानी कुछ अधिक गूढ़ चाल का उपयोग नहीं करते हैं)।
आदर्श रूप में मैं जो देखना चाहता हूं वह कुछ अच्छे उदाहरण हैं dplyrया data.tableजिस तरह से अधिक संक्षिप्त है या काफी बेहतर प्रदर्शन करता है।
उदाहरण
प्रयोगdplyrसमूहित संचालन की अनुमति नहीं देता है जो मनमाने ढंग से पंक्तियों की वापसी करता है ( एड्डी के प्रश्न से , ध्यान दें: ऐसा लगता है कि इसे duspr 0.5 में लागू किया जाएगा , साथ ही, @beginneRdo@ eddi के प्रश्न के उत्तर में उपयोग करते हुए एक संभावित कार्य-को दर्शाता है )।data.tableरोलिंग जॉइन (थैंक्स @dholstius) के साथ-साथ ओवरलैप जॉइन का समर्थन करता हैdata.tableआंतरिक रूप सेDT[col == value]या स्वचालित अनुक्रमण के माध्यम से गति केDT[col %in% values]लिए अनुकूलन करता है जो एक ही आधार आर सिंटैक्स का उपयोग करते हुए द्विआधारी खोज का उपयोग करता है। कुछ और विवरण और एक छोटे बेंचमार्क के लिए यहां देखें ।dplyrकार्यों के मानक मूल्यांकन संस्करण प्रदान करता है (उदाहरण के लिएregroup,summarize_each_) जो प्रोग्रामेटिक उपयोग को आसान बना सकता हैdplyr(नोट प्रोग्रामेटिक उपयोगdata.tableसंभव है, बस कुछ सावधानी से विचार, प्रतिस्थापन / उद्धरण, आदि की आवश्यकता है, कम से कम मेरे ज्ञान के लिए)
- मैंने अपने स्वयं के बेंचमार्क चलाए और पाया कि दोनों पैकेज "स्प्लिट अप कॉम्बिनेशन" शैली विश्लेषण में तुलनीय हैं, सिवाय इसके कि जब बहुत बड़ी संख्या में समूह (> 100K) हों जिस बिंदु पर
data.tableयह काफी तेजी से हो जाता है। - @ अरुण ने कुछ बेंचमार्क को दौड़ में शामिल किया , यह दिखाते हुए कि समूहों की संख्या बढ़ने की
data.tableतुलनाdplyrमें यह बेहतर है (दोनों पैकेजों में हाल के एन्हांसमेंट के साथ अद्यतन और आर के हाल के संस्करण)। इसके अलावा, एक बेंचमार्क जब प्राप्त करने की कोशिश अनन्य मानों हैdata.tableतेजी से ~ 6x। - (असत्यापित)
data.tableसमूह के बड़े संस्करणों पर 75% तेजी से होता है / लागू होता है / छांटता है जबकिdplyrछोटे लोगों पर 40% तेजी से होता है ( टिप्पणियों से एक और SO प्रश्न , धन्यवाद डैनस)। - मैट, के मुख्य लेखक
data.table, है पर कार्रवाई समूहीकरण बेंचमार्कdata.table,dplyrऔर अजगरpandasअप करने के लिए 2 अरब पंक्तियाँ (रैम में ~ 100GB) पर । - 80K समूहों पर एक पुराने बेंचमार्क में
data.table~ 8x तेज है
डेटा
यह पहला उदाहरण है जिसे मैंने प्रश्न अनुभाग में दिखाया है।
dat <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L), name = c("Jane", "Jane", "Jane", "Jane",
"Jane", "Jane", "Jane", "Jane", "Bob", "Bob", "Bob", "Bob", "Bob",
"Bob", "Bob", "Bob"), year = c(1980L, 1981L, 1982L, 1983L, 1984L,
1985L, 1986L, 1987L, 1985L, 1986L, 1987L, 1988L, 1989L, 1990L,
1991L, 1992L), job = c("Manager", "Manager", "Manager", "Manager",
"Manager", "Manager", "Boss", "Boss", "Manager", "Manager", "Manager",
"Boss", "Boss", "Boss", "Boss", "Boss"), job2 = c(1L, 1L, 1L,
1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L)), .Names = c("id",
"name", "year", "job", "job2"), class = "data.frame", row.names = c(NA,
-16L))
dplyrऔर data.tableटीमें बेंचमार्क पर काम कर रही हैं, इसलिए कुछ बिंदु पर एक उत्तर होगा। # 2 (सिंटैक्स) imO कड़ाई से गलत है, लेकिन यह स्पष्ट रूप से राय क्षेत्र में उद्यम करता है, इसलिए मैं भी बंद करने के लिए मतदान कर रहा हूं।
(d)plyrहैं उपाय 0 में
dplyrऔर plyrवाक्य रचना के संबंध में और मूल रूप से मुख्य कारण मैं उनके वाक्य विन्यास नापसंद है, मैं भी कई तरह से नाम के साथ अतिरिक्त कार्य ((1 से अधिक पढ़ने के लिए) जानने के लिए कि यह है कि अभी भी मेरे लिए कोई मतलब नहीं है), याद रखें कि वे क्या करते हैं, क्या तर्क देते हैं, आदि। यह हमेशा मेरे लिए प्लाई-दर्शन से एक बहुत बड़ा मोड़ रहा है।
.SD)। [गंभीरता से] मुझे लगता है कि ये वैध डिजाइन अंतर हैं जो विभिन्न लोगों के लिए अपील करेंगे
dplyrएक को पढ़ने में समान है:as.data.table(dat)[, .SD[job != "Boss" | year == min(year)][, cumjob := cumsum(job2)], by = list(name, job)]