r语言 - 将 csv 文件与通用文件标识符合并



我有一个包含大约 500 个 csv 文件的列表,每个文件的文件名由一个六位数字后跟一个年份组成(例如 123456_2015.csv(。我想将所有具有相同六位数字的文件附加到一起。我尝试实现此问题中建议的代码:在 R 中导入和 rbind 多个具有通用名称的 csv 文件,但我希望将附加的数据另存为新的 csv 文件,与当前保存的原始文件位于同一目录中。我也尝试实现以下代码,但是由此生成的csv文件不包含任何数据。

rm(list=ls())
filenames <- list.files(path = "C:/Users/smithma/Desktop/PM25_test")
NAPS_ID <- gsub('.+?\([0-9]{5,6}?)\_.+?$', '\1', filenames)
Unique_NAPS_ID <- unique(NAPS_ID)
n <- length(Unique_NAPS_ID)
for(j in 1:n){
      curr_NAPS_ID <- as.character(Unique_NAPS_ID[j])
      NAPS_ID_pattern <- paste(".+?\_(", curr_NAPS_ID,"+?)\_.+?$", sep = "" )
      NAPS_filenames <- list.files(path = "C:/Users/smithma/Desktop/PM25_test", pattern = NAPS_ID_pattern)
      write.csv(do.call("rbind",  lapply(NAPS_filenames, read.csv, header = TRUE)),file = paste("C:/Users/smithma/Desktop/PM25_test/MERGED", "MERGED_", Unique_NAPS_ID[j], ".csv", sep = ""), row.names=FALSE)
}

任何帮助将不胜感激。

由于您不执行任何数据操作,因此无需将文件视为表格数据。您只需要复制文件内容。

filenames <- list.files("C:/Users/smithma/Desktop/PM25_test", full.names = TRUE)
NAPS_ID <- substr(basename(filenames), 1, 6)
Unique_NAPS_ID <- unique(NAPS_ID)
for(curr_NAPS_ID in Unique_NAPS_ID){
  NAPS_filenames <- filenames[startsWith(basename(filenames), curr_NAPS_ID)]
  output_file <- paste0(
    "C:/Users/nwerth/Desktop/PM25_test/MERGED_", curr_NAPS_ID, ".csv"
  )
  for (fname in NAPS_filenames) {
    line_text <- readLines(fname)
    # Write the header from the first file
    if (fname == NAPS_filenames[1]) {
      cat(line_text[1], 'n', sep = '', file = output_file)
    }
    # Append every line in the file except the header
    line_text <- line_text[-1]
    cat(line_text, file = output_file, sep = 'n', append = TRUE)
  }
}

我的更改:

  • list.files(..., full.names = TRUE)通常是最好的方法。
  • 因为数字出现在文件名的开头,所以我建议substr.浏览代码时更容易了解发生了什么。
  • 与其循环遍历
  • 向量的索引,不如循环遍历值。如果向量为空,它更简洁,不太可能引起问题。
  • startsWithendsWith是相对较新的功能,它们很棒。
  • 你只关心复制线条,所以只需使用readLines将它们放入并cat将它们取出即可。

你可以考虑这样的事情:

##will take the first 6 characters of each file name
six.digit.filenames <- substr(filenames, 1,6)
path <- "C:/Users/smithma/Desktop/PM25_test/"
unique.numbers <- unique(six.digit.filenames)
for(j in unique.numbers){
  sub <- filenames[which(substr(filenames,1,6) == j)]
  data.for.output <- c()
        for(file in sub){
          ##now do your stuff with these files including read them in
          data <- read.csv(paste0(path,file))
          data.for.output <- rbind(data.for.output,data)
        }
  write.csv(data.for.output,paste0(path,j, '.csv'), row.names = F)
}

最新更新