2016-04-19 4 views
1

Ich habe einen Rasterstapel mit 84 Layern, die jeweils einem Monat Regen von November 1999 bis Oktober 2006 entsprechen. Ich habe die Layer in meinem Namen benannt Rasterstapel 199911 bis 200610 dh Jahr gefolgt von Monat. Ich habe auch einen räumlichen Datenpunkt, wo jede Zeile ein Datum im gleichen Format hat.Bedingte Extraktion von Daten aus Rasterstapeldaten basierend auf Werten in einem Datenpunkt für räumliche Punkte

Ich möchte aus dem Rasterstapel die Summe aller Niederschläge zwischen dem Datum einer Zeile und dem vorherigen Oktober an der räumlichen Position dieser Zeile extrahieren. Wenn also das Datum einer Zeile das Jahr 20006 (Juni 2000) war, würde es den gesamten Niederschlag am Standort dieser Zeile zwischen 199910 (Oktober 1999) und 20006 summieren. Da ich viele Daten habe, möchte ich diesen Prozess automatisieren.

Ich habe versucht, dies zur Arbeit zu bringen, aber ohne Freude. Hat jemand irgendwelche Tipps?

Antwort

1

Hier ist eine Option:

library(raster) 

# Vector of dates 
dates <- format(seq(as.Date('1999/1/11'), as.Date('2006/1/10'), by='month'), '%Y%m') 

# RasterStack with random data 
s <- setNames(stack(replicate(length(dates), raster(matrix(runif(100), 10)))), 
       paste0('rain', dates)) 

# Create a SpatialPointsDataFrame with some random dates and coords 
d <- data.frame(x=runif(10), y=runif(10), date=sample(dates, 10)) 
coordinates(d) <- ~x+y 

# Split the spdf by date 
d_by_date <- split(d, d$date) 

# Extract values 
rain_sum <- unsplit(lapply(d_by_date, function(x) { 
    # current year 
    y <- as.numeric(substr(x$date, 1, 4)) 
    # current month 
    m <- as.numeric(substr(x$date, 5, 6)) 
    # if month is after Oct, start from that year's Oct 
    # if month is before Oct, start from previous year's Oct 
    if(m < 11) y <- y-1 
    start_date <- as.Date(sprintf('%s/10/01', y)) 
    # if start_date is earlier than first time slice, reset to first time slice 
    start_date <- max(min(as.Date(sub('rain', '01', names(s)), '%d%Y%m')), start_date) 
    end_date <- as.Date(paste0(x$date, '01'), '%Y%m%d') 
    # Sequence of dates to sum over 
    i <- format(seq(start_date, end_date, by='month'), 'rain%Y%m') 
    # Extract values and sum 
    sum(extract(s[[i]], x)) 
}), d$date) 
+0

Vielen Dank für die Hilfe jbaums! Leider kann ich den Code nicht für mich arbeiten lassen, ich bekomme sowohl eine Warnung als auch einen Fehler. Ich denke, die "if" -Anweisung wird nur den ersten Eintrag überprüfen, also werde ich versuchen, eine for-Schleife zu schreiben und sehen, ob das hilft. Warnmeldung: Wenn (m <11) y <- y - 1: die Bedingung hat Länge> 1, und nur das erste Element wird Fehler im Format (seq (start_date, end_date, by = eingesetzt werden "Monat"), "Regen% Y% m"): Fehler beim Auswerten des Arguments 'x' beim Auswählen einer Methode für die Funktion 'format': Fehler in seq.Date (start_datum, end_datum, nach = "monat"): 'to' muss von Länge 1 sein – James

+0

Ich habe den Code für mich arbeiten und haben Ihre Antwort bearbeitet, um die Änderungen widerzuspiegeln, die ich vorgenommen habe. Vor allem habe ich Ihr Päckchen zugunsten einer For-Schleife getauscht. Habe deine Antwort angenommen. – James

+0

Außer aus irgendeinem Grund wurde meine Bearbeitung nicht akzeptiert ... go figure. – James

Verwandte Themen