* I am currently reading in a series of files, applying the same functions to them one at a time, and then merging the resulting data frames e.g.:>MyRows <- c("RowA", "RowB", "RowC")>>File1_DF <- read.delim("\\\\DirectoryToFiles\\File1_Folder\\File1.txt", stringsAsFactors=FALSE, check.names=FALSE)>File1_DF <- as.data.frame(t(File1_DF[MyRows,]))>File1_DF <- as.data.frame(t(File1_DF))>mergeDF <- merge(mergeDF,File1_DF, by.x = "Row.names", by.y="row.names")>>File2_DF <- read.delim("\\\\DirectoryToFiles\\File2_Folder\\File2.txt", stringsAsFactors=FALSE, check.names=FALSE)>File2_DF <- as.data.frame(t(File2_DF[MyRows,]))>File2_DF <- as.data.frame(t(File2_DF))>mergeDF <- merge(mergeDF,File2_DF, by.x = "Row.names", by.y="row.names")...etc I want to know if I can use a list of the filenames c("File1", "File2", "File2") etc. and apply a function to do this in a more automated fasion? This would involve using the list value in the directory path to read in the file i.e.>*MyFilesValue*_DF <- read.delim("\\\\DirectoryToFolders\\*MyFilesValue*_Folder\\*MyFilesValue*.txt", stringsAsFactors=FALSE, check.names=FALSE)Any help appreciated * [[alternative HTML version deleted]]
Enrico Schumann
2013-May-16 05:15 UTC
[R] R help: Batch read files based on names in a list
On Wed, 15 May 2013, Jonathan Dry <dryjon at gmail.com> writes:> * > > I am currently reading in a series of files, applying the same functions to > them one at a time, and then merging the resulting data frames e.g.: > >>MyRows <- c("RowA", "RowB", "RowC")>>File1_DF <- read.delim("\\\\DirectoryToFiles\\File1_Folder\\File1.txt", stringsAsFactors=FALSE, check.names=FALSE)>File1_DF <- as.data.frame(t(File1_DF[MyRows,]))>File1_DF <- as.data.frame(t(File1_DF))>mergeDF <- merge(mergeDF,File1_DF, by.x = "Row.names", by.y="row.names")>>File2_DF <- read.delim("\\\\DirectoryToFiles\\File2_Folder\\File2.txt", stringsAsFactors=FALSE, check.names=FALSE)>File2_DF <- as.data.frame(t(File2_DF[MyRows,]))>File2_DF <- as.data.frame(t(File2_DF))>mergeDF <- merge(mergeDF,File2_DF, by.x = "Row.names", by.y="row.names") > > ...etc > > I want to know if I can use a list of the filenames c("File1", "File2", > "File2") etc. and apply a function to do this in a more automated fasion? > This would involve using the list value in the directory path to read in > the file i.e.Something like this? files <- dir("my_directory") for (f in files) { ## do something with file 'f' } -- Enrico Schumann Lucerne, Switzerland http://enricoschumann.net
HI, You could use: (# with 3 files in my folder) lfiles<-list.files(pattern=".txt") ?lfiles #[1] "file1.txt" "file2.txt" "file3.txt" lst1<-lapply(lfiles,function(x) read.table(x,header=TRUE,sep="",stringsAsFactors=FALSE)) lst1 #[[1]] #? col1 col2 #1??? 1? 0.5 #2??? 2? 0.2 #3??? 3? 0.3 #4??? 4? 0.3 #5??? 5? 0.1 #6??? 6? 0.2 # #[[2]] ?# col1 col3 #1??? 1??? A #2??? 2??? B #3??? 3??? C # #[[3]] ?# col1 col4 #1??? 1? 0.1 #2??? 2? 0.5 #3??? 4? 0.9 library(plyr) ?join_all(lst1,by="col1") #? col1 col2 col3 col4 #1??? 1? 0.5??? A? 0.1 #2??? 2? 0.2??? B? 0.5 #3??? 3? 0.3??? C?? NA #4??? 4? 0.3 <NA>? 0.9 #5??? 5? 0.1 <NA>?? NA #6??? 6? 0.2 <NA>?? NA join_all(lst1,by="col1",type="inner") #? col1 col2 col3 col4 #1??? 1? 0.5??? A? 0.1 #2??? 2? 0.2??? B? 0.5 #or ?Reduce(function(...) merge(...,all=TRUE),lst1) #? col1 col2 col3 col4 #1??? 1? 0.5??? A? 0.1 #2??? 2? 0.2??? B? 0.5 #3??? 3? 0.3??? C?? NA #4??? 4? 0.3 <NA>? 0.9 #5??? 5? 0.1 <NA>?? NA #6??? 6? 0.2 <NA>?? NA #Suppose you don't want to read "file3.txt" ?lfilesSub<-lfiles[!lfiles%in% "file3.txt"] lfilesSub #[1] "file1.txt" "file2.txt" A.K. ----- Original Message ----- From: Jonathan Dry <dryjon at gmail.com> To: r-help at r-project.org Cc: Sent: Wednesday, May 15, 2013 1:51 PM Subject: [R] R help: Batch read files based on names in a list * I am currently reading in a series of files, applying the same functions to them one at a time, and then merging the resulting data frames e.g.:>MyRows <- c("RowA", "RowB", "RowC")>>File1_DF <- read.delim("\\\\DirectoryToFiles\\File1_Folder\\File1.txt", stringsAsFactors=FALSE, check.names=FALSE)>File1_DF <- as.data.frame(t(File1_DF[MyRows,]))>File1_DF <- as.data.frame(t(File1_DF))>mergeDF <- merge(mergeDF,File1_DF, by.x = "Row.names", by.y="row.names")>>File2_DF <- read.delim("\\\\DirectoryToFiles\\File2_Folder\\File2.txt", stringsAsFactors=FALSE, check.names=FALSE)>File2_DF <- as.data.frame(t(File2_DF[MyRows,]))>File2_DF <- as.data.frame(t(File2_DF))>mergeDF <- merge(mergeDF,File2_DF, by.x = "Row.names", by.y="row.names")...etc I want to know if I can use a list of the filenames c("File1", "File2", "File2") etc. and apply a function to do this in a more automated fasion? This would involve using the list value in the directory path to read in the file i.e.>*MyFilesValue*_DF <- read.delim("\\\\DirectoryToFolders\\*MyFilesValue*_Folder\\*MyFilesValue*.txt", stringsAsFactors=FALSE, check.names=FALSE)Any help appreciated * ??? [[alternative HTML version deleted]] ______________________________________________ R-help at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.