Tarafından v1.9.2, rbindlistbiraz gelişti, dahil olmak üzere birçok özellik uygulamak:
SEXPTYPEBağlama sırasında en yüksek sütun seçimi - FR # 2456 ve Hata # 4981'iv1.9.2 kapatmada uygulanır .
- Taşıma
factorilk uygulanan - düzgün sütunları v1.8.10kapanış Hata # 2650 bağlayıcı ve genişletilmiş sipariş dikkatle içinde faktörleri v1.9.2kapanış, sıra FR # 4856 ve Hata # 5019 .
Buna ek olarak v1.9.2, rbind.data.tableayrıca fill, R'de uygulanan eksik sütunları doldurarak bağlanmasına izin veren bir argüman kazandı .
Şimdi v1.9.3, bu mevcut özelliklerde daha da fazla gelişme var:
rbindlistuse.namesvarsayılan olarak FALSEgeriye uyumluluk için olan bir argüman kazanır .
rbindlistayrıca fillvarsayılan olarak FALSEgeriye dönük uyumluluk için kullanılan bir argüman kazanır .
- Bu özelliklerin tümü C dilinde uygulanır ve işlevsellik eklerken hızdan ödün vermemek için dikkatlice yazılır.
- Yana
rbindlistşimdi isimleri ve dolgu eksik sütunlara göre eşleşebilir, rbind.data.tablesadece çağrıları rbindlistşimdi. Tek fark, geriye dönük uyumluluk için use.names=TRUEvarsayılan olarak olmasıdır rbind.data.table.
rbind.data.frameönlenebilecek kopyalar (mnel'in de işaret ettiği) nedeniyle (C'ye geçerek) oldukça yavaşlar. Bence tek sebep bu değil. Sütun adlarını kontrol etme / eşleştirme uygulaması, rbind.data.framedata.frame başına çok sayıda sütun olduğunda ve bağlanmak için bu tür birçok data.fram olduğunda daha yavaş olabilir (aşağıdaki karşılaştırmada gösterildiği gibi).
Ancak, rbindlistbelirli özelliklerin (editör) kontrol edilmesi (faktör seviyelerini kontrol etmek veya isimleri eşleştirmek gibi), ona göre çok daha küçük (veya hiç) ağırlık taşımaktadır rbind.data.frame. Çünkü dikkatlice hız ve bellek için optimize edilmiş C'ye uygulandılar.
İşte rbindlist's use.namesözelliğini kullanarak sütun isimleriyle eşleştirirken etkili ciltlemeyi vurgulayan bir karşılaştırma ölçütü v1.9.3. Veri seti 10000 veriden oluşur. Her biri 10 * 500 boyutunda çerçeveler.
Not: Bu kriter için bir karşılaştırma içerecek şekilde güncellenmiştir dplyrs'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
Adları kontrol etmeden sütunları bu şekilde bağlamak sadece 1.3 aldı, burada sütun adlarını kontrol etmek ve uygun şekilde ciltlemek sadece 1.5 saniye daha sürdü. Temel çözümle karşılaştırıldığında, bu, dplyrsürümüne göre 14 kat daha hızlı ve 18 kat daha hızlıdır .
attr<-,class<-ve (bence)rownames<-tüm yerinde değiştirin.