我有一个文件夹中的气候文件列表(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.asc
到p397912_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
}
答案 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个文件)
确保您写入新文件夹(而不是包含源数据的文件夹)