Domanda:
Modo efficiente per unire più dataframe in R
Anthony Kong
2011-08-16 12:49:37 UTC
view on stackexchange narkive permalink

Sto costruendo un frame di big data unendo il contenuto di alcuni file insieme. Questi file condividono lo stesso layout di colonne.

  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)  

Il codice precedente è efficiente?

Dovrei invece riutilizzare lo stesso nome di variabile, ad esempio

  tmp = merge (c, c1, all = TRUE) tmp = merge (tmp, c2, all = TRUE)  
Che tipo di efficienza cerchi? Velocità o utilizzo della memoria?
mptiktas: Bella domanda! Prima le prestazioni, poi l'impronta di memoria.
Dubito che avrebbe un effetto serio sulle prestazioni, ma leggerei i file in un elenco quindi userei `rbind` o` cbind` tramite `do.call` per" unire ". In questo modo non avrai oggetti extra in giro.
Se le cose stanno come sospetto (vedi la mia risposta), potrebbe anche essere meglio unire i file al di fuori di R e poi leggerli in: le prestazioni saranno buone e probabilmente puoi evitare la necessità di avere più di 1 file (il quello che stai attualmente aggiungendo al file risultante) in memoria allo stesso tempo.
@Nick: è totalmente d'accordo con il tuo suggerimento. In questo caso particolare ho solo accesso in lettura alla cartella di origine. Ovviamente, potrei copiare i file in una posizione locale e metterli insieme.
Puoi aggiornare la tua domanda con i contenuti di `dput (head (c))`, `dput (head (c1))`, `dput (head (c2))` in modo che le persone possano aggiornare la loro risposta con un codice che funziona? Non penso che i riferimenti a "controlla myFavoriteToolToDoHypotheticalAnalysis" siano così costruttivi per nessuno. Sarebbe un gioco molto più interessante se potessimo effettivamente vedere questi metodi all'opera.
@chase: Ho provato quei comandi. Poiché rivelerà alcuni dei dati sottostanti che sono informazioni proprietarie, probabilmente non posso pubblicarli qui.
Che ne dici di creare dati casuali che duplichino la tua struttura dati? `rnorm ()`, `runif ()`, `sample ()`, ecc. possono essere tutti usati qui. In sostanza, voglio solo qualcosa che attiri risposte più dettagliate rispetto a "controlla data.table, ho sentito che è bello per questa roba" e un esempio riproducibile darebbe alle persone la possibilità di mostrare quanto sia bello XYZ.
@chase. Buon punto. Ci proveremo. R newbie qui quindi non trattenere il respiro. :-)
Cinque risposte:
Aaron left Stack Overflow
2011-08-16 23:53:08 UTC
view on stackexchange narkive permalink

Puoi catarli all'interno di R come segue:

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

Dato che hai detto che hanno lo stesso layout di colonna, probabilmente vuoi che i tre (o più) data.frames vengano aggiunti uno sotto l'altro, giusto?

In tal caso, puoi guardare rbind :

  cres = rbind (c, c1, c2)  

Attenzione, però: con molti data.frames , Ho notato che le prestazioni sono scadenti (questo ha a che fare con il modo in cui i data.frames sono gestiti in memoria, come elenchi di colonne). Inoltre, potrebbero esserci problemi con i fattori: avere lo stesso layout di colonna, ma mantenere livelli diversi per i fattori potrebbe rompere questo (non ho provato).

Nota: se i tuoi dati sono tutti numerici, converti prima ogni data.frame in matrice, quindi esegui un rbind e trasforma nuovamente il risultato in un data.frame.
Alex
2011-08-16 16:41:50 UTC
view on stackexchange narkive permalink

Controlla rbind.fill dal pacchetto plyr. Di recente ho visto il commento di Hadley secondo cui è efficiente ma non è in grado di trovarlo.

Zach
2011-08-16 18:39:11 UTC
view on stackexchange narkive permalink

Se per efficiente intendi "veloce", controlla il pacchetto data.table. Ha fusioni molto veloci.

Beta
2011-08-16 22:48:35 UTC
view on stackexchange narkive permalink

Puoi provare l'istruzione join nel pacchetto sqldf. Trovo molto più semplice lavorare con SQL nel caso in cui un set di dati di grandi dimensioni. Trova il link qui per riferimento



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...