By v1.9.2
, rbindlist
avait beaucoup évolué, implémentant de nombreuses fonctionnalités, notamment:
- Choix de la plus haute
SEXPTYPE
des colonnes lors de la liaison - implémenté en v1.9.2
fermant FR # 2456 et Bug # 4981 .
- Gérer
factor
correctement les colonnes - d'abord implémenté lors de la v1.8.10
fermeture du bogue n ° 2650 et étendu à la liaison des facteurs ordonnés avec soin v1.9.2
également, en fermant FR # 4856 et le bogue n ° 5019 .
En outre, dans v1.9.2
, a rbind.data.table
également gagné un fill
argument, qui permet de lier en remplissant les colonnes manquantes, implémenté dans R.
Maintenant v1.9.3
, il y a encore plus d'améliorations sur ces fonctionnalités existantes:
rbindlist
gagne un argument use.names
, qui par défaut est FALSE
pour la compatibilité ascendante.
rbindlist
gagne également un argument fill
, qui par défaut est également FALSE
pour la compatibilité ascendante.
- Ces fonctionnalités sont toutes implémentées en C, et écrites avec soin pour ne pas compromettre la vitesse lors de l'ajout de fonctionnalités.
- Puisque
rbindlist
peut maintenant correspondre par noms et remplir les colonnes manquantes, il rbind.data.table
suffit d'appeler rbindlist
maintenant. La seule différence est que use.names=TRUE
par défaut pour rbind.data.table
, pour une compatibilité ascendante.
rbind.data.frame
ralentit un peu principalement à cause des copies (ce que @mnel souligne également) qui pourraient être évitées (en passant à C). Je pense que ce n'est pas la seule raison. La mise en œuvre de la vérification / correspondance des noms de colonnes dans rbind.data.frame
pourrait également être plus lente lorsqu'il y a beaucoup de colonnes par data.frame et qu'il y a beaucoup de data.frames à lier (comme indiqué dans le benchmark ci-dessous).
Cependant, ce rbindlist
manque de certaines fonctionnalités (comme la vérification des niveaux de facteur ou la correspondance des noms) n'a qu'un poids très minime (ou pas) pour qu'il soit plus rapide que rbind.data.frame
. C'est parce qu'ils ont été soigneusement implémentés en C, optimisés pour la vitesse et la mémoire.
Voici un benchmark qui met en évidence la liaison efficace tout en faisant correspondre les noms de colonnes ainsi qu'en utilisant rbindlist
la use.names
fonctionnalité de v1.9.3
. L'ensemble de données se compose de 10000 data.frames de taille 10 * 500 chacun.
NB: ce benchmark a été mis à jour pour inclure une comparaison avec dplyr
'sbind_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
La liaison des colonnes en tant que telles sans vérifier les noms n'a pris que 1,3 alors que la vérification des noms de colonnes et la liaison appropriée ne prenaient que 1,5 seconde de plus. Par rapport à la solution de base, c'est 14 fois plus rapide et 18 fois plus rapide que dplyr
la version de.
attr<-
,class<-
et (je pense)rownames<-
tous modifier en place.