Tarafından v1.9.2
, rbindlist
biraz gelişti, dahil olmak üzere birçok özellik uygulamak:
SEXPTYPE
Bağlama sırasında en yüksek sütun seçimi - FR # 2456 ve Hata # 4981'iv1.9.2
kapatmada uygulanır .
- Taşıma
factor
ilk uygulanan - düzgün sütunları v1.8.10
kapanış Hata # 2650 bağlayıcı ve genişletilmiş sipariş dikkatle içinde faktörleri v1.9.2
kapanış, sıra FR # 4856 ve Hata # 5019 .
Buna ek olarak v1.9.2
, rbind.data.table
ayrı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:
rbindlist
use.names
varsayılan olarak FALSE
geriye uyumluluk için olan bir argüman kazanır .
rbindlist
ayrıca fill
varsayılan olarak FALSE
geriye 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.table
sadece çağrıları rbindlist
şimdi. Tek fark, geriye dönük uyumluluk için use.names=TRUE
varsayı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.frame
data.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, rbindlist
belirli ö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 dplyr
s'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, dplyr
sü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.