J'ai du code qui à un endroit se retrouve avec une liste de trames de données que je veux vraiment convertir en une seule trame de Big Data.
J'ai reçu quelques conseils d'une question précédente qui essayait de faire quelque chose de similaire mais de plus complexe.
Voici un exemple de ce que je commence (c'est très simplifié à titre d'illustration):
listOfDataFrames <- vector(mode = "list", length = 100)
for (i in 1:100) {
listOfDataFrames[[i]] <- data.frame(a=sample(letters, 500, rep=T),
b=rnorm(500), c=rnorm(500))
}
J'utilise actuellement ceci:
df <- do.call("rbind", listOfDataFrames)
do.call("rbind", list)
idiome est ce que j'ai également utilisé auparavant. Pourquoi avez-vous besoin de l'initialeunlist
?Réponses:
Utilisez bind_rows () du package dplyr:
la source
.id = "column_label"
ajoute les noms de lignes uniques en fonction des noms des éléments de la liste.dplyr
est à la fois rapide et un outil solide à utiliser, j'ai changé cela en réponse acceptée. Les années passent!Une autre option consiste à utiliser une fonction plyr:
C'est un peu plus lent que l'original:
Je suppose que l'utilisation
do.call("rbind", ...)
sera l'approche la plus rapide que vous trouverez, à moins que vous ne puissiez faire quelque chose comme (a) utiliser des matrices au lieu d'un data.frames et (b) préallouer la matrice finale et l'affecter plutôt que de la développer .Modifier 1 :
D'après le commentaire de Hadley, voici la dernière version de
rbind.fill
CRAN:C'est plus facile que rbind, et légèrement plus rapide (ces timings tiennent le coup sur plusieurs exécutions). Et pour autant que je le comprends, la version de
plyr
on github est encore plus rapide que cela.la source
I()
pourrait remplacerdata.frame
dans votreldply
appelmelt.list
refonte (2)do.call(function(...) rbind(..., make.row.names=F), df)
est utile si vous ne voulez pas les noms de domaine uniques générés automatiquement.Dans un souci d'exhaustivité, j'ai pensé que les réponses à cette question nécessitaient une mise à jour. "Je suppose que l'utilisation
do.call("rbind", ...)
va être l'approche la plus rapide que vous trouverez ..." C'était probablement vrai pour mai 2010 et quelque temps après, mais vers septembre 2011, une nouvelle fonction arbindlist
été introduite dans ladata.table
version 1.8.2 du paquet. , avec une remarque que "Cela fait la même chose quedo.call("rbind",l)
, mais beaucoup plus rapidement". Combien plus rapide?la source
ldply
contenir un tas de trames de données longues et fondues. Quoi qu'il en soit, j'ai obtenu une accélération incroyable en utilisant votrerbindlist
suggestion.dplyr::rbind_all(listOfDataFrames)
fera aussi l'affaire.rbindlist
mais qui ajoute les trames de données par colonne? quelque chose comme une cbindlist?do.call()
courais sur une liste de trames de données depuis 18 heures, et que je n'avais toujours pas fini, merci !!!Code:
Session:
MISE À JOUR : Relancez le 31 janvier 2018. A couru sur le même ordinateur. Nouvelles versions de packages. Ajout de graines pour les amateurs de graines.
MISE À JOUR : Relancez le 6 août 2019.
la source
set.seed
), mais j'ai vu des différences dans les performances les plus défavorables.rbindlist
avait en fait le meilleur cas le plus défavorable ainsi que le meilleur cas typique dans mes résultatsIl y a aussi
bind_rows(x, ...)
dansdplyr
.la source
Voici une autre façon de procéder (ajoutez-le simplement aux réponses, car
reduce
c'est un outil fonctionnel très efficace qui est souvent négligé en remplacement des boucles. Dans ce cas particulier, aucun de ces deux n'est beaucoup plus rapide que do.call)en utilisant la base R:
ou, en utilisant l'inverse:
la source
Comment cela devrait être fait dans le sens inverse:
la source
map
si vousbind_rows
pouvez prendre une liste de cadres de données?Un visuel mis à jour pour ceux qui souhaitent comparer certaines des réponses récentes (je voulais comparer la solution purrr à dplyr). Fondamentalement, j'ai combiné les réponses de @TheVTM et @rmf.
Code:
Informations sur la session:
Versions du package:
la source
La seule chose avec laquelle les solutions
data.table
manquent est la colonne identifiant pour savoir de quelle trame de données dans la liste les données proviennent.Quelque chose comme ça:
Le
idcol
paramètre ajoute une colonne (.id
) identifiant l'origine de la trame de données contenue dans la liste. Le résultat ressemblerait à quelque chose comme ceci:la source