Ich habe eine Liste der Klimadateien in einem Ordner (EDU-Link: https://cloudstor.aarnet.edu.au/plus/index.php/s/QFpaBDR7q2GbDCN). Sie sind wie folgt benannt p[year][month]_0p5.asc
.Erstellen einer Reihe von Dateien Duplikate und Umbenennen von ihnen
Beispiel:
p198001_0p5.asc
p198002_0p5.asc
...
p198012_0p5.asc
p198101_0p5.asc
...
p201012_0p5.asc
I 2000 Jahre Daten erstellen möchten, indem sie in dieser Reihenfolge diese 31 Jahre (1980 bis 2010) zu wiederholen und das Umbenennen von ihnen eine Liste von Dateien p198001_0p5.asc
-p397912_0p5.asc
haben
Als Beispiel wird der endgültige Ordner p201101_0p5.asc
enthalten, der die gleichen Daten wie p198001_0p5.asc
enthält, aber p201101_0p5.asc
heißen wird.
Ich habe keine Idee, wie man das in R macht. Jede Hilfe wäre sehr willkommen!
Update 19-07-2017: @ Mako212 Vorschlag scheint zu arbeiten, aber ich hatte Speicherprobleme (Fehlermeldung # protect(): Schutz Stapelüberlauf). Ich änderte meine Strategie und erstellte ein weiteres Skript, das auf seinem freundlichen Vorschlag basierte, 131 Jahre Daten von 1880 bis 2010 zu generieren. Ich tat dies, indem ich die Serie von 31 Jahren (1980-2010) wiederholte. Hier ist der Code für den Fall, dass Sie sich auch diese Strategie ansehen möchten. Es funktioniert gut:
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
}
Ich denke, Sie können mit einer verschachtelten 'for' -Schleife dorthin kommen. Sie benötigen 'list.files (pattern =" * .asc ")'. Dann etwas in der Form 'for (f in files) {für (x in 1:65) {write.csv (f, sprintf (" p% d ", x))}}'. Es wird ein wenig mehr Finesse brauchen, um den vollständigen Dateinamen zu erstellen, aber das ist die allgemeine Idee. – Mako212