Próbuję merge
kilka data.frames
w jeden data.frame
. Ponieważ mam całą listę plików, próbuję to zrobić za pomocą struktury pętli.Scal kilka data.frames w jednym data.frame z pętlą
Do tej pory podejście pętli działa dobrze. Wygląda to jednak dość nieefektywnie i zastanawiam się, czy istnieje szybsze i łatwiejsze podejście.
Oto scenariusz: Mam katalog z kilkoma plikami .csv
. Każdy plik zawiera ten sam identyfikator, który może być użyty jako zmienna połączenia. Ponieważ pliki mają dość duży rozmiar, pomyślałem, aby czytać każdy plik po jednym na raz zamiast czytać wszystkie pliki naraz. Dostaję wszystkie pliki katalogu z list.files
i czytam w pierwszych dwóch plikach. Następnie używam merge
, aby uzyskać jedną 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)
Teraz używam for
pętlę, aby wszystkie pozostałe .csv
plików i merge
je do już istniejących data.frame
:
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)
}
Mimo że działa dobrze Zastanawiałem się, czy istnieje bardziej elegancki sposób na wykonanie pracy?
może warto zauważyć, że można dostać cały th scalone, z dodatkową kolumną '.id' zawierającą nazwy plików poprzez wywołanie' ldply' zamiast 'llply'. Wywołanie 'Reduce' lub' merge' jest niepotrzebne. – CharlesB