Я не понимаю ваш пример my.seq
в отношении того, что вы объясняете в желании различных подмножеств растров. Вот обработанный пример, где я создаю объект списка с вашими определенными подмножествами. Все, что вам нужно сделать, это передать желаемый числовой индекс подмножества растров в двойной скобочный индекс объекта стека. Объект списка должен быть также подмножеством с использованием двойной скобки, поэтому он выглядит беспорядочно s[[idx[[i]]]]
. Однако, если вы разобьете его, для первого набора растров это просто: raster::calc(s[[1:2]], mean)
library(raster)
file <- system.file("external/test.grd", package="raster")
s <- stack(file, file, file)
s <- addLayer(s, raster(file)/2, raster(file)*2)
idx <- list( c(1:2), c(3), c(4:5) )
s.mean <- stack()
for(i in 1:length(idx)) {
s.mean <- addLayer(s.mean, calc(s[[idx[[i]]]], mean) )
}
s.mean
plot(s.mean)
Что касается вашего расширенного вопроса, вы можете использовать класс даты в R для создания индексов, а еще удобнее, пакет rts позволяет использовать эти типы сводок временных рядов.
Здесь давайте создадим стек с 365 слоями, представляющими дни года.
library(raster)
f <- raster(nrows=50, ncols=50, xmn=0, xmx=10)
s <- stack()
for(i in 1:365) {
x <- f
x[] <- runif(ncell(x),0,10)
s <- addLayer(s, x)
}
Теперь мы можем создать соответствующий вектор дат.
( d <- seq(as.Date("1970/1/1"), as.Date("1970/12/31"), "days") )
Вектор дат можно запросить для получения индекса растра. Скажем, мы хотим получить среднее значение за декабрь, мы можем использовать which
для получения индекса.
( dec.idx <- which( months(d) == "December") )
( dec.mean <- calc(s[[dec.idx]], mean) )
Вы можете легко создать список, содержащий индексы растрового стека для каждого месяца, который будет эквивалентен тому, что вы описываете в своем объекте my.seq.
months.idx <- list()
for(m in unique( months(d) ) ) {
months.idx[[m]] <- which( months(d) == m)
}
months.idx
Тем не менее, это встроенная функциональность для выполнения такого типа временных суммирований в пакете rts, поэтому мы можем сократить любой цикл for, приведя стек к объекту rts, а затем используя одну из функций apply.
library(rts)
s.date <- rts::rts(s, d)
( s.month <- apply.monthly(s.date, mean) )