创建一系列文件重复并重命名它们

时间:2017-07-17 16:00:50

标签: r

我有一个文件夹中的气候文件列表(EDU链接:https://cloudstor.aarnet.edu.au/plus/index.php/s/QFpaBDR7q2GbDCN)。它们被命名为关注p[year][month]_0p5.asc

示例:

p198001_0p5.asc

p198002_0p5.asc

...

p198012_0p5.asc

p198101_0p5.asc

...

p201012_0p5.asc

我希望通过重复这31年(1980年至2010年)的顺序来创建2000年的数据,并将它们重命名为包含从p198001_0p5.ascp397912_0p5.asc的文件列表

例如,最终文件夹将包含p201101_0p5.asc,其中包含与p198001_0p5.asc相同的数据,但会将其命名为p201101_0p5.asc

我不知道如何在R中这样做。任何帮助都会非常感激!

更新19-07-2017:@ Mako212 建议似乎有效,但我遇到了内存问题(错误消息#infault():保护堆栈溢出)。我改变了我的策略,并根据他的善意建议创建了另一个脚本,从1880年到2010年生成了131年的数据。我通过重复31年(1980-2010)系列来做到这一点。如果您希望了解该策略,请参阅以下代码。它工作正常:

require(purrr)
require(data.table) 
library(raster)

setwd('...')
files <- list.files(pattern= "*.asc")
files
length(files)

fileDF <- files %>% map(raster)

#set the output directory
output_dir <- "..."

#  set month and year counters
startYear <- 2010 
startMonth <- 12
fileNumber <- 1

for (i in fileDF){
  startYear <- 2010 - (fileNumber-1) %/% 12
  for (x in 1:6){
    print(startYear)
    print(startMonth)
    print(fileNumber)
    writeRaster(i, paste(output_dir, sprintf("p%d%s%d_0p5.asc", startYear, ifelse(startMonth<10,0,""), startMonth), sep="/"), format = "ascii")
    startYear <- startYear - 31
    if (startYear < 1880) break #  don't create files before December, 1880
  }
  if (startMonth > 1 ) {
    startMonth <- startMonth - 1
  }
  else{
    startMonth <- 12
  }
  fileNumber <- fileNumber + 1    
}

1 个答案:

答案 0 :(得分:1)

好的,这是一般的想法:

require(purrr)
require(data.table) 
#  after playing with SDMTools::read.asc, data.table::fread seems to
#  be more reliable. That said, if fread() isn't reading your data
#  correctly, you might try using the SDMTools function instead. 
#  I also chose to save everything as .csv, but again, you can try 
#  using the SDMTools read/write.asc functions if you want

files <- list.files(pattern= "*.asc")


fileDF <- files %>% map(fread)

#  set month and year counters

startYear <- 1980 
startMonth <- 1
fileNumber <- 1

for (i in fileDF){


    #  increment startYear by 1 every 13th file   
    startYear <- 1980 + (fileNumber-1) %/% 12

    for (x in 1:65){
        #  added underscore for clarity between year and month
        #  format is p1980_01_0p5.csv
        write.csv(i, sprintf("p%d_%s%d_0p5.csv", startYear, ifelse(startMonth<10,0,""), startMonth))
        startYear <- startYear + 31

        #  don't create files past December, 3979
        if (startYear > 3979) break
    }
    if (startMonth < 12) {
        startMonth <- startMonth +1
    }
    else{
        startMonth <- 1
    }

    fileNumber <- fileNumber + 1    


}

设置循环计数器,假设您有31年的数据(12 * 31个文件)

确保您写入新文件夹(而不是包含源数据的文件夹)

相关问题