【问题标题】:Reading multiple csv files in a folder for individual groups为单个组读取文件夹中的多个 csv 文件
【发布时间】:2018-08-02 08:51:51
【问题描述】:

我在一个文件夹中有 44496 个 csv 文件。

如果我想在一个文件夹中读取所有这些 csv 文件,我可以这样做:

files = list.files(pattern="*.csv")
library(data.table)
DT = do.call(rbind, lapply(files, fread)

每个文件的名称为wrX_Y.csv。我有 5562 个 X 值和 8 个 Y 值。 例如,对于 X 的每个值,我有 8 个 csv 文件。

  wr1_258, wr1_260, wr1_265, wr1_280, wr1_290, wr1_300, wr1_310,wr1_320 
  wr2_258, wr2_260, wr2_265, wr2_280, wr2_290, wr2_300, wr2_310,wr2_320
  .
  .
  .
  .
  wr5562_258, wr5562_260, wr5562_265, wr5562_280, wr5562_290, wr5562_300, wr5562_310,wr5562_320 

我想合并属于给定 X 的所有文件。例如,

  wr1_258, wr1_260, wr1_265, wr1_280, wr1_290, wr1_300, wr1_310,wr1_320 into a single csv
  wr2_258, wr2_260, wr2_265, wr2_280, wr2_290, wr2_300, wr2_310,wr2_320 into a single csv and so on

假设names.list 是一个包含所有 X 值的向量。我如何读取属于单个 X 的所有 csv,将它们合并并写出

  for(i in names.list){
   files <- list.files(pattern = "*.csv", full.names = T)
   DT = do.call(rbind, lapply(files, fread) # one read those csv files which belong to i
   fwrite(DT,paste0(i,"alldata.csv"))
  }

【问题讨论】:

  • 您检查过list.files(..., recursive=TRUE, full.names=TRUE) 以检查子文件夹并获取完整路径吗?使用模式,您可以选择任何正则表达式来选择您的文件。
  • 好的。我现在修改了这个问题。我指定使用path
  • 因此,通过使用patter='^X1_.*\\.csv$',您只选择以X1_ 开头的文件...另外我建议使用file.path 作为文件路径而不是paste0
  • @drmariod 递归参数在这种情况下有什么影响?
  • 谢谢。抱歉,我的问题不清楚,所以您的解决方案对我不起作用。我现在修改了我的问题。

标签: r csv for-loop import data.table


【解决方案1】:

这应该可行。

## list all files in the folder, enter the path of folder containing .csv files
list_files <- list.files(path = 'path') 

## number of iterations 
len <- 5562
ffiles <- vector('list', length = len)

## create a dictionary
## this groups the name of files based on X values (1,2...5562)
for(i in seq(list_files))
{
    file_name <- list_files[i]
    string <- unlist(strsplit(file_name, split = '_'))[1]
    string <- gsub(pattern = '[a-z]', replacement = '', x = string)
    print(string)
    if (string %in% names(ffiles))
    {
        ffiles[[string]] <- append(ffiles[[string]], file_name)
    } else {
        ffiles[[string]] <- file_name
    }

}

## this will be used in next step
full_path <- list.files(path = 'folder_path', full.names = T)

## rbind and write all files
for (i in names(ffiles))
{
    files_path <- append(files_path, sapply(ffiles[i], function(x) list.files(path = full_path, pattern = x, full.names = T)))
    assign(paste0('df',i), do.call(rbind, lapply(files_path, fread)))
    fwrite(get(paste0('df',i), .GlobalEnv), paste0('df_',i,'.csv'))
}

【讨论】:

    【解决方案2】:

    这似乎更像是regex 而不是data.table qn。改进您对list.files 函数的模式输入:

      for(i in names.list) {
         files <- list.files(pattern=paste0("wr", i, "_(.*).csv"), full.names=TRUE)
         DT <- rbindlist(lapply(files, fread))
         fwrite(DT, paste0(i,"alldata.csv))
      }
    

    【讨论】:

      【解决方案3】:

      您可以使用rbindlist() 函数来绑定data.tableslist,并使用idcol 参数添加一个额外的列来指示每一行的原始文件:

      library(data.table)
      
      # Load all files into a named list of data.tables:
      files <- list.files(pattern="*.csv")
      dt_list <- lapply(files, fread)
      names(dt_list) <- files # for the idcol argument in rbindlist
      
      # Concatenate all data.tables into a single data.table, with a column
      # indicating each row's file of origin.
      # add use.names = TRUE if you columns are not in the same order in 
      # each file.
      # add fill = TRUE if some columns are not present in all files
      dt <- rbindlist(dt_list, idcol = "file")
      
      # Convert file column to a column of X and Y
      dt[, fileX := gsub("_.*", "", file)]
      dt[, fileX := gsub("^wr", "", fileX)]
      dt[, fileY := gsub(".*_", "", file)]
      dt[, fileY := gsub(".csv", "", fileY)]
      
      # For each X, output the corresponding data.table:
      for (xtype in unique(dt$fileX)) {
         # subset dt and drop file identifier columns
         xdt <- dt[fileX == xtype]
         xdt[, file := NULL]
         xdt[, fileX := NULL]
         xdt[, fileY := NULL]
      
         # write table:
         fwrite(xdt, file=paste0("wr", xtype, ".csv"))
      } 
      

      【讨论】:

        猜你喜欢
        • 2017-04-21
        • 1970-01-01
        • 2017-08-20
        • 2018-01-27
        • 2015-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多