rr-faq

How to import multiple .csv files at once?


Suppose we have a folder containing multiple data.csv files, each containing the same number of variables but each from different times. Is there a way in R to import them all simultaneously rather than having to import them all individually?

My problem is that I have around 2000 data files to import and having to import them individually just by using the code:

read.delim(file="filename", header=TRUE, sep="\t")

is not very efficient.


Solution

  • Something like the following should result in each data frame as a separate element in a single list:

    temp = list.files(pattern="\\.csv$")
    myfiles = lapply(temp, read.delim)
    

    This assumes that you have those CSVs in a single directory--your current working directory--and that all of them have the lower-case extension .csv.

    If you then want to combine those data frames into a single data frame, see the solutions in other answers using things like do.call(rbind,...), dplyr::bind_rows() or data.table::rbindlist().

    If you really want each data frame in a separate object, even though that's often inadvisable, you could do the following with assign:

    temp = list.files(pattern="\\.csv$")
    for (i in 1:length(temp)) assign(temp[i], read.csv(temp[i]))
    

    Or, without assign, and to demonstrate (1) how the file name can be cleaned up and (2) show how to use list2env, you can try the following:

    temp = list.files(pattern="\\.csv$")
    list2env(
      lapply(setNames(temp, make.names(gsub("\\.csv$", "", temp))), 
             read.csv), envir = .GlobalEnv)
    

    But again, it's often better to leave them in a single list.