अवलोकन
मैं अपेक्षाकृत परिचित हूं 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)]