Mesclar vários data.frames em um data.frame com um loop

Eu estou tentando merge vários data.frames em um data.frame . Desde que eu tenho uma lista inteira de arquivos que eu estou tentando fazer com uma estrutura de loop.

Até agora, a abordagem de loop funciona bem. No entanto, parece bastante ineficiente e eu estou querendo saber se existe uma abordagem mais rápida e fácil.

Aqui está o cenário: Eu tenho um diretório com vários arquivos .csv . Cada arquivo contém o mesmo identificador que pode ser usado como a variável de fusão. Como os arquivos são bem grandes, pensei em ler cada arquivo, um de cada vez, em R, em vez de ler todos os arquivos de uma só vez. Então eu recebo todos os arquivos do diretório com list.files e leio nos dois primeiros arquivos. Depois eu uso a merge para obter um 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) 

Agora eu uso um loop for para obter todos os arquivos .csv restantes e merge los no data.frame já existente:

 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) } 

Mesmo que funcione bem, eu queria saber se existe uma maneira mais elegante de fazer o trabalho?

Você pode querer olhar para a questão intimamente relacionada em stackoverflow .

Eu abordaria isso em duas etapas: importar todos os dados (com plyr ) e, em seguida, mesclar tudo:

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

Isso lhe dará uma lista de todos os arquivos que você precisa para se juntar. Há muitas maneiras de fazer isso, mas aqui está uma abordagem (com Reduce ):

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

Alternativamente, você pode fazer isso com o pacote de reshape se não se sentir confortável com o Reduce :

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

Se não me engano, uma mudança bem simples poderia eliminar o kludge 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) }