Перемещение среднего в определенном окне при сохранении даты, R - PullRequest
1 голос
/ 12 марта 2019

У меня большой растровый стек из 50 слоев, и я хочу вычислить среднее и максимальное с помощью подвижного окна 10. Например, мне нужно вычислить среднее для слоев 1:10 и 11:20 и т. Д.(итого 5 средних растров).В то же время я хочу сохранить даты своих слоев на основе функции, которую я использую (например, дату растров с максимальным значением или средней датой).

До сих пор я пробовал следующее, но очень медленно.Может ли кто-нибудь помочь мне сделать это более эффективно?

Учитывая s_all как мой растровый стек:

for(i in 1:5){
  t[[i]]<-calc(
            s_all[[((i-1)*10 + 1):((i-1)*10 + 10)]], 
            fun = mean, na.rm = T)
  t@z$Date[[i]]<-mean.Date(as.Date(
                              c(s_all@z$Date[[((i-1)*10 + 1)]],
                              s_all@z$Date[[((i-1)*10 + 10)]])))
}

РЕДАКТИРОВАТЬ Пример данных

r <- raster(ncol=10, nrow=10, vals=1:100)
s_all <- stack(replicate(50, r))
d<-sample(seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day"), 50)
s_all<-setZ(s_all,d[],"Date")

1 Ответ

1 голос
/ 12 марта 2019

Вы говорите, что хотите «скользящее среднее», но это не то, что вы описываете (скользящее среднее будет возвращать то же количество слоев с локально сглаженными значениями). То, что вы описываете, представляет собой объединение слоев с шагом 10. Вы можете получить это с помощью stackApply или aggregate.

Я изменил данные вашего примера, чтобы изменить их значения, и я не рандомизирую даты.

library(raster)
r <- raster(ncol=10, nrow=10)
s <- stack(lapply(1:50, function(i) setValues(r, i)))
d <- seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day")[1:50]
s <- setZ(s, d, "Date")

Для stackApply нужен индекс:

idx <- rep(1:5, each=10)
ss <- stackApply(s, idx, mean)

Учитывая, что количество агрегированных слоев постоянно, вы также можете использовать aggregate

sss <- aggregate(s, c(1,1,10), mean)

Теперь установите новую дату, здесь я использую максимум.

newd <- tapply(getZ(s), idx, max)
newd <- as.Date(newd, origin="1970-01-01")
ss <- setZ(ss, newd, "Date")

ss
#class      : RasterBrick 
#dimensions : 10, 10, 100, 5  (nrow, ncol, ncell, nlayers)
#resolution : 36, 18  (x, y)
#extent     : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
#crs        : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
#source     : memory
#names      : index_1, index_2, index_3, index_4, index_5 
#min values :     5.5,    15.5,    25.5,    35.5,    45.5 
#max values :     5.5,    15.5,    25.5,    35.5,    45.5 
#Date       : 1999-01-10, 1999-01-20, 1999-01-30, 1999-02-09, 1999-02-19 
...