Минимальные значения в ячейке стека растров для определенного квантиля значений ячеек r - PullRequest
0 голосов
/ 08 ноября 2018

Я борюсь со значениями ячеек основания растрового стека. Вот некоторые примеры данных:

library(raster)

r <- raster(ncol=10, nrow=10)
s <- stack(lapply(1:365, function(i) setValues(r, runif(100, 0, 1))))
# adding NAs
s[[2]][sample(100, 25, TRUE)] <- NA
s[sample(100, 25, TRUE)] <- NA

У меня есть растровый стек с временными рядами на весь год. Некоторые ячейки полностью установлены на NA, а также некоторые отдельные значения в пределах временных рядов. Я пытаюсь свести значения в каждой ячейке к нижнему квантилю 0,025 ячейки. Вот как далеко я продвинулся с моей функцией:

f <- function(i) {
  v_q <- quantile(i,probs = .025 ,na.rm=TRUE)
  if (length(v_q) > 0) {
    if(i[v_q] < v_q) {
      i[v_q] <- v_q
    }
    i
  }
  i  
}

x <- calc(s, fun = f)

Когда я применяю его к calc, я получаю следующую ошибку:

Error in .calcTest(x[1:5], fun, na.rm, forcefun, forceapply) : 
  cannot use this function

Есть идеи?

1 Ответ

0 голосов
/ 08 ноября 2018

Не уверен насчет ошибки, но ваша функция выглядит немного странно.

Сначала давайте добавим случайное начальное число для воспроизводимости:

library(raster)

r <- raster(ncol=10, nrow=10)
set.seed(42)
s <- stack(lapply(1:365, function(i) setValues(r, runif(100, 0, 1))))
# adding NAs
s[[2]][sample(100, 25, TRUE)] <- NA
s[sample(100, 25, TRUE)] <- NA

calc в стеке или кирпиче в основном работает с векторами значений по слоям.

Так что это должно работать:

f <- function(i) {
  q <- quantile(i,probs = .025 ,na.rm=TRUE)

  i[i<q] <- q
  i

}

x <- calc(s,fun=f)

А для проверки:

q <- calc(s,fun = function(x) quantile(x,0.025,na.rm=T))

par(mfrow=c(1,2))

plot(s[[1]] < q,main="s[[1]] < q")
plot(x[[1]] == q,main="x[[1]] == q")

enter image description here

...