Convertir une liste de blocs de données dans une trame de données
J'ai un code qui à un endroit se termine avec une liste de trames de données qui j'ai vraiment envie de les convertir vers un seul gros bloc de données.
J'ai eu quelques conseils d'un question précédente qui était en train de faire quelque chose de similaire mais plus complexe.
Voici un exemple de ce que je suis en train de créer avec (c'est extrêmement simplifié pour l'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))
}
Je suis actuellement en utilisant ceci:
df <- do.call("rbind", listOfDataFrames)
- Voir aussi cette question: stackoverflow.com/questions/2209258/...
- Le
do.call("rbind", list)
idiome est ce que j'ai utilisé avant. Pourquoi avez-vous besoin initialunlist
? - quelqu'un peut-il m'expliquer la différence entre faire.call("rbind", "liste") et rbind(liste) - pourquoi les sorties pas la même chose?
- Parce que faire.call() ne retourne pas les arguments un par un, mais utilise une liste de tenir les arguments de la fonction. Voir https://www.stat.berkeley.edu/~s133/Docall.html
InformationsquelleAutor JD Long | 2010-05-17
Vous devez vous connecter pour publier un commentaire.
Utilisation bind_rows() de la dplyr package:
.id = "column_label"
ajoute la ligne unique des noms sur la liste les noms d'éléments.dplyr
est à la fois rapide et un excellent outil à utiliser, je l'ai changé ce pour la accepté de répondre. Les années, ils volent par!Une autre option est d'utiliser un plyr fonction:
C'est un peu plus lent que l'original:
Ma conjecture est que l'utilisation de
do.call("rbind", ...)
va être le plus rapide de l'approche que vous allez trouver, sauf si vous pouvez faire quelque chose comme (a) utiliser une des matrices à la place d'une base de données.images et (b) préallouer la finale de la matrice, et de confier à elle plutôt que de la développer.Edit 1:
Basé sur Hadley commentaire, voici la dernière version de
rbind.fill
de CRAN:C'est plus facile que rbind, et légèrement plus rapide (ces horaires hold up sur plusieurs pistes). Et aussi loin que je le comprends, la version de
plyr
sur github est encore plus rapide que cela.I()
pourrait remplacerdata.frame
dans votreldply
appelmelt.list
à remodeler(2)do.call(function(...) rbind(..., make.row.names=F), df)
est utile si vous ne voulez pas le générés automatiquement unique rownames.bind_rows()
est plus rapide selon mdm réponse et je pense que c'est le plus simple. Il dispose également de la fonctionnalité d'ajout d'un colonne idDans le but d'exhaustivité, je pensais que la réponse à cette question nécessite une mise à jour. "J'imagine qu'à l'aide de
do.call("rbind", ...)
va être le plus rapide de l'approche que vous trouverez..." C'est probablement vrai pour le mois de Mai 2010 et après un certain temps, mais dans environ sept 2011 une nouvelle fonctionrbindlist
a été introduit dans ledata.table
package de la version 1.8.2, avec une remarque que "Ce ne la même chose quedo.call("rbind",l)
, mais beaucoup plus rapide". Comment beaucoup plus rapide?ldply
ing un tas de long, fusion des trames de données. De toute façon, j'ai eu une incroyable accélération à l'aide de votrerbindlist
suggestion.dplyr::rbind_all(listOfDataFrames)
fera l'affaire).rbindlist
mais que ajoutez les trames de données par colonne ? quelque chose comme un cbindlist ?do.call()
avait été en cours d'exécution sur une liste de trames de données pour 18 heures, et n'avait toujours pas fini, je vous remercie!!!Code:
Session:
Mise à JOUR:
Réexécutez Le 31-Janv-2018. Exécuté sur le même ordinateur. De nouvelles versions de paquets. Ajouté semences pour les amateurs.
Mise à JOUR: Réexécutez le 06-Août-2019.
set.seed
) mais vu certaines différences dans les pires cas de performance.rbindlist
avaient effectivement le meilleur du pire des cas ainsi que les meilleures typique dans mes résultatsIl est également
bind_rows(x, ...)
dansdplyr
.Voici une autre façon, cela peut être fait (juste de l'ajouter à l'réponses, car
reduce
est très efficace outil fonctionnel qui est souvent négligé, comme un remplacement pour les boucles. Dans ce cas particulier, aucune de ces sont nettement plus rapides que faire.d'appel)à l'aide de la base de R:
ou, à l'aide de la tidyverse:
Comment cela doit être fait dans le tidyverse:
map
sibind_rows
peut prendre une liste de dataframes?Visuel mis à jour pour ceux qui veulent comparer les unes des dernières réponses (j'ai voulu comparer la purrr à dplyr solution). Fondamentalement, j'ai combiné les réponses de @TheVTM et @rmf.
Code:
Session D'Info:
Les Versions De Package:
La seule chose que les solutions avec
data.table
manquant est l'identifiant de la colonne de savoir à partir de laquelle dataframe dans la liste, les données proviennent de.Quelque chose comme ceci:
La
idcol
paramètre ajoute une colonne (.id
) l'identification de l'origine de la dataframe figurant dans la liste. Le résultat ressemblerait à quelque chose comme ceci: