Unisci diversi data.frames in un data.frame con un loop

Sto cercando di merge più data.frames in un data.frame . Dal momento che ho un intero elenco di file sto cercando di farlo con una struttura ad anello.

Finora l’approccio ad anello funziona bene. Tuttavia, sembra piuttosto inefficiente e mi chiedo se esiste un approccio più rapido e semplice.

Ecco lo scenario: ho una directory con diversi file .csv . Ogni file contiene lo stesso identificatore che può essere utilizzato come variabile di fusione. Poiché i file sono di dimensioni piuttosto grandi, ho pensato di leggere ogni file uno alla volta in R invece di leggere tutti i file contemporaneamente. Quindi ottengo tutti i file della directory con list.files e leggo nei primi due file. Successivamente utilizzo l’ merge per ottenere un data.frame .

 FileNames <- list.files(path=".../tempDataFolder/") FirstFile <- read.csv(file=paste(".../tempDataFolder/", FileNames[1], sep=""), header=T, na.strings="NULL") SecondFile <- read.csv(file=paste(".../tempDataFolder/", FileNames[2], sep=""), header=T, na.strings="NULL") dataMerge <- merge(FirstFile, SecondFile, by=c("COUNTRYNAME", "COUNTRYCODE", "Year"), all=T) 

Ora utilizzo un ciclo for per ottenere tutti i restanti file .csv e merge nel data.frame già esistente:

 for(i in 3:length(FileNames)){ ReadInMerge <- read.csv(file=paste(".../tempDataFolder/", FileNames[i], sep=""), header=T, na.strings="NULL") dataMerge <- merge(dataMerge, ReadInMerge, by=c("COUNTRYNAME", "COUNTRYCODE", "Year"), all=T) } 

Anche se funziona bene, mi chiedevo se c’è un modo più elegante per portare a termine il lavoro?

Potresti voler esaminare la domanda strettamente correlata su StackOverflow .

Mi avvicinerei a questo in due passaggi: importa tutti i dati (con plyr ), quindi plyr insieme:

 filenames <- list.files(path=".../tempDataFolder/", full.names=TRUE) library(plyr) import.list <- llply(filenames, read.csv) 

Questo ti darà una lista di tutti i file che ora dovrai unire. Ci sono molti modi per farlo, ma ecco un approccio (con Reduce ):

 data <- Reduce(function(x, y) merge(x, y, all=T, by=c("COUNTRYNAME", "COUNTRYCODE", "Year")), import.list, accumulate=F) 

In alternativa, puoi farlo con il pacchetto di reshape se non ti senti a tuo agio con Reduce :

 library(reshape) data <- merge_recurse(import.list) 

Se non sbaglio, una semplice modifica potrebbe eliminare il 3:length(FileNames) :

 FileNames <- list.files(path=".../tempDataFolder/", full.names=TRUE) dataMerge <- data.frame() for(f in FileNames){ ReadInMerge <- read.csv(file=f, header=T, na.strings="NULL") dataMerge <- merge(dataMerge, ReadInMerge, by=c("COUNTRYNAME", "COUNTRYCODE", "Year"), all=T) }