TimApple24
TimApple24

Reputation: 13

Combining .txt files in R using a loop

I'm currently trying to use R to combine dozens of .txt files into one single .txt file. Attached below is the code that I've been experimenting with so far. The files that I'm trying to combine have very similar names, for example: "e20171ny0001000.txt" and "e20171ct0001000.txt". As you can see, the only difference in the file names are the different state abbreviations. This is why I've been trying to use a for loop, in order to try to go through all the state abbreviations.

setwd("/Users/tim/Downloads/All_Geographies")

statelist = c('ak','al','ar','az','ca','co','ct','dc','de','fl','ga','hi','ia','id','il','in','ks','ky','la','ma','md','me','mi','mn','mo','ms','mt','nc','nd','ne','nh','nj','nm','nv','ny','oh','ok','or','pa','ri','sc','sd','tn','tx','ut','va','vt','wa','wi','wv','wy')

for (i in statelist){
  file_names <- list.files(getwd())
  file_names <- file_names[grepl(paste0("e20171", i, "0001000.txt"),file_names)]
  files <- lapply(file_names, read.csv, header=F, stringsAsFactors = F)
  files <- do.call(rbind,files)
}

write.table(files, file = "RandomFile.txt", sep="\t")

When I run the code, there isn't a specific error that pops up. Instead the entire code runs and nothing happens. I feel like my code is missing something that is preventing it from running correctly.

Upvotes: 1

Views: 108

Answers (1)

akrun
akrun

Reputation: 886948

We need to create a list to update. In the OP's code,files is a list of data.frame that gets updated in the for loop. Instead, the output needss to be stored in a list. For this, we can create a list of NULL 'out' and then assign the output to each element of 'out'

out <- vector('list', length(statelist))
for (i in seq_along(statelist)){
  file_names <- list.files(getwd())
  file_names <- file_names[grepl(paste0("e20171", statelist[i], 
              "0001000.txt"),file_names)]
  files <-  lapply(file_names, read.csv, header=FALSE, stringsAsFactors = FALSE)
   out[[i]] <- do.call(rbind, files)


  }

As out is a list of data.frame, we need to loop over the list and then write it back to file

newfilenames <- paste0(statelist, "_new", ".txt")
lapply(seq_along(out), function(i) write.table(out[[i]],
      file = newfilenames[i], quote = FALSE, row.names = FALSE))

Upvotes: 2

Related Questions