Question:
Moyen efficace de fusionner plusieurs dataframes dans R
Anthony Kong
2011-08-16 12:49:37 UTC
view on stackexchange narkive permalink

Je construis une trame Big Data en fusionnant le contenu de quelques fichiers ensemble. Ces fichiers partagent la même disposition de colonnes.

  c = read.delim ('bigfile1.txt') c1 = read.delim ('bigfile2.txt') c2 = read.delim ('bigfile3 .txt ') ctmp1 = merge (c, c1, all = TRUE) ctmp2 = merge (ctmp1, c2, all = TRUE)  

Le code ci-dessus est-il efficace?

Dois-je réutiliser le même nom de variable à la place, par exemple

  tmp = merge (c, c1, all = TRUE) tmp = merge (tmp, c2, all = TRUE)  
Quel type d'efficacité recherchez-vous? Vitesse ou utilisation de la mémoire?
mptiktas: Bonne question! Performances d'abord, empreinte mémoire ensuite.
Je doute que cela ait un effet sérieux sur les performances, mais je lirais les fichiers dans une liste puis utiliserais `rbind` ou` cbind` via `do.call` pour" fusionner ". De cette façon, vous n'avez pas d'objets supplémentaires qui traînent.
Si les choses sont comme je le soupçonne (voir ma réponse), vous feriez peut-être même mieux de joindre les fichiers en dehors de R, puis de les lire: les performances seront bonnes et vous pourrez probablement éviter d'avoir plus d'un fichier (le celui que vous ajoutez actuellement au fichier résultant) en mémoire en même temps.
@Nick: est totalement d'accord avec votre suggestion. Dans ce cas particulier, je n'ai qu'un accès en lecture au dossier source. Bien sûr, je pourrais cp les fichiers vers un emplacement local et les rassembler.
Pouvez-vous mettre à jour votre question avec le contenu de `dput (head (c))`, `dput (head (c1))`, `dput (head (c2))` afin que les gens puissent mettre à jour leur réponse avec un code réel qui fonctionne? Je ne pense pas que les références à "check out myFavoriteToolToDoHypotheticalAnalysis" soient aussi constructives pour quiconque. Ce serait un jeu beaucoup plus intéressant si nous pouvions réellement voir ces méthodes à l'œuvre.
@chase: J'ai essayé ces commandes. Puisqu'il révélera certaines des données sous-jacentes qui sont des informations propriétaires, je ne peux probablement pas les publier ici.
Que diriez-vous de créer des données aléatoires qui dupliquent votre structure de données? `rnorm ()`, `runif ()`, `sample ()`, etc. peuvent tous être utilisés ici. Je veux essentiellement quelque chose qui attirera des réponses plus détaillées que "vérifier data.table, j'entends que c'est cool pour ce truc" et un exemple reproductible donnerait aux gens une chance de montrer à quel point XYZ est cool.
@chase. Bon point. Je vais essayer. R newbie ici alors ne retenez pas votre souffle. :-)
Cinq réponses:
#1
+12
Aaron left Stack Overflow
2011-08-16 23:53:08 UTC
view on stackexchange narkive permalink

Vous pouvez les insérer dans R comme suit:

  read.table (pipe ("cat bigfile1.txt bigfile2.txt bigfile3.txt"))  
#2
+9
Nick Sabbe
2011-08-16 13:27:54 UTC
view on stackexchange narkive permalink

Puisque vous mentionnez qu'ils ont la même disposition de colonne, vous voulez probablement que les trois (ou plus) data.frames soient ajoutés en dessous l'un de l'autre, n'est-ce pas?

Dans ce cas, vous pouvez regarder rbind :

  cres = rbind (c, c1, c2)  

Attention cependant: avec beaucoup de data.frames , J'ai remarqué que les performances étaient inférieures à la moyenne (cela a à voir avec la façon dont les data.frames sont gérés en mémoire, sous forme de listes de colonnes). En outre, il peut y avoir des problèmes avec les facteurs: avoir la même disposition de colonne, mais maintenir des niveaux différents pour les facteurs peut casser cela (je n'ai pas essayé).

Remarque: si vos données sont toutes numériques, convertissez d'abord chaque data.frame en matrice, puis effectuez une reliure et transformez à nouveau le résultat en data.frame.
#3
+3
Alex
2011-08-16 16:41:50 UTC
view on stackexchange narkive permalink

Découvrez rbind.fill du package plyr. J'ai récemment vu le commentaire de Hadley selon lequel il est efficace mais incapable de le trouver.

#4
+2
Zach
2011-08-16 18:39:11 UTC
view on stackexchange narkive permalink

Si par efficace vous entendez «rapide», consultez le paquet data.table. Il a des fusions très rapides.

#5
+2
Beta
2011-08-16 22:48:35 UTC
view on stackexchange narkive permalink

Vous pouvez essayer l'instruction join dans le package sqldf. Je trouve beaucoup plus facile de travailler avec SQL dans le cas d'un grand ensemble de données. Veuillez trouver le lien ici pour référence



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...