द्वारा v1.9.2, rbindlistकाफी विकसित हुआ था, जिसमें कई विशेषताएं शामिल हैं:
SEXPTYPEबाइंडिंग करते समय सबसे अधिक कॉलम चुनना - FR # 2456 और बग # 4981 को v1.9.2बंद करने में लागू किया गया ।
factorस्तंभों को ठीक से संभालना - सबसे पहले बग # 2650 को v1.8.10बंद करने में लागू किया गया और बाध्यकारी आदेशों को ध्यान में रखते हुए एफआर # 4856 और बग # 5019 को बंद कर दिया गया ।v1.9.2
इसके अलावा, में v1.9.2, rbind.data.tableएक fillतर्क भी प्राप्त हुआ , जो कि आर में लागू होने वाले लापता कॉलमों को भरकर बांधने की अनुमति देता है।
अब v1.9.3, इन मौजूदा सुविधाओं पर और भी अधिक सुधार हुए हैं:
rbindlistएक तर्क प्राप्त करता है use.names, जो डिफ़ॉल्ट रूप से FALSEपश्चगामी संगतता के लिए है।
rbindlistएक तर्क भी प्राप्त करता है fill, जो डिफ़ॉल्ट रूप से भी FALSEपश्चगामी संगतता के लिए है।
- इन विशेषताओं को C में लागू किया गया है, और कार्यक्षमता को जोड़ते हुए गति में समझौता नहीं करने के लिए सावधानीपूर्वक लिखा गया है।
- चूंकि
rbindlistअब नामों से मेल कर सकते हैं और लापता कॉलम भर सकते हैं, rbind.data.tableबस rbindlistअब कॉल करें । एकमात्र अंतर यह है कि use.names=TRUEडिफ़ॉल्ट रूप से rbind.data.table, पश्चगामी संगतता के लिए।
rbind.data.frameज्यादातर प्रतियां (जो @mnel के रूप में अच्छी तरह से बाहर इंगित करता है) के कारण काफी धीमा हो जाता है जिसे टाला जा सकता है (सी में स्थानांतरित करके)। मुझे लगता है कि यह एकमात्र कारण नहीं है। स्तंभ के नामों की जाँच / मिलान के लिए कार्यान्वयन rbind.data.frameतब भी धीमा हो सकता है, जब प्रति डेटा कई स्तंभ हों। बाइंड करने के लिए ऐसे कई डेटा हैं।
हालाँकि, उस rbindlistकमी (एड) में कुछ विशेषताएं (जैसे कारक स्तरों की जाँच करना या नाम मिलान करना) बहुत छोटे (या नहीं) वजन की तुलना में तेज़ होती हैं rbind.data.frame। यह इसलिए है क्योंकि वे सी में सावधानी से लागू किए गए थे, गति और स्मृति के लिए अनुकूलित।
यहाँ एक बेंचमार्क है कि प्रकाश डाला कुशल अच्छी तरह का उपयोग कर के रूप में स्तंभ नाम से मिलान करते हुए बंधन है rbindlistकी use.namesसे सुविधा v1.9.3। डेटा सेट में 10000 data.frames होते हैं, जिनमें से प्रत्येक का आकार 10 * 500 होता है।
ध्यान दें: इस मानदंड में एक तुलना शामिल करने के लिए अद्यतन किया गया है dplyrकीbind_rows
library(data.table) # 1.11.5, 2018-06-02 00:09:06 UTC
library(dplyr) # 0.7.5.9000, 2018-06-12 01:41:40 UTC
set.seed(1L)
names = paste0("V", 1:500)
cols = 500L
foo <- function() {
data = as.data.frame(setDT(lapply(1:cols, function(x) sample(10))))
setnames(data, sample(names))
}
n = 10e3L
ll = vector("list", n)
for (i in 1:n) {
.Call("Csetlistelt", ll, i, foo())
}
system.time(ans1 <- rbindlist(ll))
# user system elapsed
# 1.226 0.070 1.296
system.time(ans2 <- rbindlist(ll, use.names=TRUE))
# user system elapsed
# 2.635 0.129 2.772
system.time(ans3 <- do.call("rbind", ll))
# user system elapsed
# 36.932 1.628 38.594
system.time(ans4 <- bind_rows(ll))
# user system elapsed
# 48.754 0.384 49.224
identical(ans2, setDT(ans3))
# [1] TRUE
identical(ans2, setDT(ans4))
# [1] TRUE
नामों के लिए जाँच किए बिना स्तंभों को बांधना सिर्फ 1.3 लिया जहाँ स्तंभ नामों की जाँच करना और उचित रूप से बाँधना केवल 1.5 सेकंड अधिक लिया गया। बेस सॉल्यूशन की तुलना में, यह 14x तेज़ है, और 18x तेज़ है dplyr।
attr<-,class<-और (मुझे लगता है)rownames<-सभी जगह संशोधित होते हैं।