首页 文章

将多个CSV文件读入单独的数据框

提问于
浏览
28

假设我们在目录C:\ R \ Data中有文件file1.csv,file2.csv,...和file100.csv,我们希望将它们全部读入单独的数据框(例如file1,file2,...和file100) .

这样做的原因是,尽管具有相似的名称,但它们具有不同的文件结构,因此将它们放在列表中并不是很有用 .

我可以使用 lapply 但返回包含100个数据帧的单个列表 . 相反,我想在全球环境中使用这些数据框 .

如何直接将多个文件读入全局环境?或者,或者,如何将数据框列表的内容解压缩到其中?

9 回答

  • 24

    快速草案,未经测试:

    • 使用 list.files() aka dir() 动态生成文件列表 .

    • 这将返回一个向量,只是在 for 循环中沿向量运行 .

    • 读取第i个文件,然后使用 assign() 将内容放入新变量file_i

    这应该为你做的伎俩 .

  • 24

    谢谢大家的回复 .

    为了完整性,这里是我加载任意数量(制表符)分隔文件的最终答案,在这种情况下有6列数据,其中第1列是字符,2是因子,余数是数字:

    ##Read files named xyz1111.csv, xyz2222.csv, etc.
    filenames <- list.files(path="../Data/original_data",
        pattern="xyz+.*csv")
    
    ##Create list of data frame names without the ".csv" part 
    names <-substr(filenames,1,7))
    
    ###Load all files
    for(i in names){
        filepath <- file.path("../Data/original_data/",paste(i,".csv",sep=""))
        assign(i, read.delim(filepath,
        colClasses=c("character","factor",rep("numeric",4)),
        sep = "\t"))
    }
    
  • 12

    assign 与包含所需数据框名称的字符变量一起使用 .

    for(i in 1:100)
    {
       oname = paste("file", i, sep="")
       assign(oname, read.csv(paste(oname, ".txt", sep="")))
    }
    
  • 2

    别 . 将它们保存为列表 . 这是要走的路 .

  • 7

    这个答案是对哈德利答案的一个更有用的补充 .

    尽管OP特别希望将每个文件作为一个单独的对象读入其R工作区,但许多其他人天真地登陆这个问题可能会认为最好将文件读入单个数据框列表中 .

    所以对于记录,这里是你如何做到这一点 .

    #If the path is different than your working directory
    # you'll need to set full.names = TRUE to get the full
    # paths.
    my_files <- list.files("path/to/files")
    
    #Further arguments to read.csv can be passed in ...
    all_csv <- lapply(my_files,read.csv,...)
    
    #Set the name of each list element to its
    # respective file name. Note full.names = FALSE to
    # get only the file names, not the full path.
    names(all_csv) <- gsub(".csv","",
                           list.files("path/to/files",full.names = FALSE),
                           fixed = TRUE)
    

    现在 my_files[["filename"]] 可以引用任何文件,这在工作区中只有单独的 filename 变量并不是更糟糕,而且通常更方便 .

  • 6

    这是一种使用lapply解压缩data.frames列表的方法

    filenames <- list.files(path="../Data/original_data",
                            pattern="xyz+.*csv")
    
    filelist <- lappy(filenames, read.csv)
    
    #if necessary, assign names to data.frames
    names(filelist) <- c("one","two","three")
    
    #note the invisible function keeps lapply from spitting out the data.frames to the console
    
    invisible(lapply(names(filelist), function(x) assign(x,filelist[[x]],envir=.GlobalEnv)))
    
  • 0

    从全局环境访问列表元素的一种简单方法是 attach 列表 . 请注意,这实际上会在搜索路径上创建一个新环境,并将列表中的元素复制到其中,因此您可能希望在附加后删除原始列表,以防止两个可能不同的副本浮动 .

  • 14

    从文件夹中读取所有CSV文件并创建与文件名相同的vactors:

    setwd("your path to folder where CSVs are")
    
    filenames <- gsub("\\.csv$","", list.files(pattern="\\.csv$"))
    
    for(i in filenames){
      assign(i, read.csv(paste(i, ".csv", sep="")))
    }
    
  • -2
    #copy all the files you want to read in R in your working directory
    a <- dir()
    #using lapply to remove the".csv" from the filename 
    for(i in a){
    list1 <- lapply(a, function(x) gsub(".csv","",x))
    }
    #Final step 
    for(i in list1){
    filepath <- file.path("../Data/original_data/..",paste(i,".csv",sep=""))
    assign(i, read.csv(filepath))
    }
    

相关问题