Спасибо за предоставленный пример данных:
library(raster)
r <- raster(nrow=5, ncol=5)
set.seed(20181114)
s <- stack(lapply(1:5, function(i) setValues(r, runif(25, max=50))))
names(s) <- c("X2001", "X2002a", "X2002b", "X2002c", "X2002d")
s[[2]][1:3] <- NA
Вот две функции, которые делают то же самое. # 1, возможно, проще, но, вероятно, менее эффективно.
annualIndex1 <- function(ts, year) {
year <- as.character(year)
ts_year <- subset(ts, (grep(year, names(ts))))
medianval <- calc(ts_year, median, na.rm = TRUE)
dif <- abs(ts_year - medianval)
which.min(dif)
}
x1 <- annualIndex1(s, 2002)
Этот использует calc
для объединения нескольких шагов
annualIndex2 <- function(ts, year){
year <- as.character(year)
ts_year <- subset(ts, (grep(year, names(ts))))
fun <- function(x){
y <- median(x, na.rm=TRUE)
which.min(abs(x - y))
}
calc(ts_year, fun)
}
x2 <- annualIndex2(s, 2002)
Результаты одинаковы (и нет NA)
all(values(x1) == values(x2))
#[1] TRUE
Однако, если вы создадите ячейку NA во всех слоях
s[5] <- NA
функция 2 не работает. Это можно настроить следующим образом
annualIndex2b <- function(ts, year){
year <- as.character(year)
ts_year <- subset(ts, (grep(year, names(ts))))
fun <- function(x){
if (all(is.na(x))) return( NA )
y <- median(x, na.rm=TRUE)
which.min(abs(x - y))
}
calc(ts_year, fun)
}
x2b <- annualIndex2b(s, 2002)
Вы используете термин «маска», но на самом деле вы создаете индекс, можете ли вы использовать соответствующие ячейки с strackSelect
следующим образом:
ts_year <- subset(ts, (grep(year, names(ts))))
v <- stackSelect(ts_year, x2)