द्वारा 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<-
सभी जगह संशोधित होते हैं।