2017-07-17 3 views
1

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  
} 
+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

Antwort

1

Okay, hier ist die allgemeine Idee:

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  


} 

Die Schleifenzähler gesetzt werden vorausgesetzt, Sie haben genau 31 Jahre im Wert von Daten (12 * 31 Dateien)

Fabrikat sicher, dass Sie in einen neuen Ordner schreiben (nicht den, der die Quelldaten enthält)

+0

Vielen Dank! Ich habe 'fileDF <- files %>% map (raster)' und 'writeRaster' in meinem Code verwendet. Alle 12 Monate für 1980, 2011, 2042 ... 3964 (31 Jahre Inkremente) werden richtig gespeichert, aber dann geht die Schleife zurück zu 1980 Monat 1 Dateinummer 13 und damit habe ich ein Problem mit dem Überschreiben von Dateien. Ich habe ein Beispiel von 31 * 12 .asc-Dateien (EDU-Link) hinzugefügt – Cecile

+0

@Cecile Können Sie den Code, den Sie gerade ausführen, veröffentlichen? Es hört sich an, als könnte irgendwo ein Tippfehler sein. 'fileNumber' sollte niemals untergehen, wenn die Schleife korrekt ausgeführt wird. Die Schleife sollte enden und "fileNumber" sollte 372 – Mako212

+0

@Cecile in der Zwischenzeit Ich werde Ihre Beispieldaten herunterladen, um zu sehen, ob ich irgendwelche Probleme finden kann – Mako212

Verwandte Themen