Условный расчет разницы между максимальным (растром) и каждым растровым слоем растрового стека - PullRequest
0 голосов
/ 02 мая 2019

У меня есть список растровых стеков с именем r.lst.Мне нужно вычислить разницу между max(r.lst[[i]]) (сложенными растрами) и каждым растровым слоем этого растрового стека.Однако я хочу сделать это условно для каждого пикселя, учитывая which.max(r.lst[[i]]).Так что каждая ячейка вычитается из ее предыдущего max, а не следующей.Ниже приведен пример:

# example data-------------------------------------------
set.seed(123)
#our list of rasters
r.lst <- as.list(1:3)
# setting up list pf raster stacks
r1 <- raster(nrows = 1, ncols = 1, res = 0.5, xmn = -1.5, xmx = 1.5, ymn = -1.5, ymx = 1.5, vals = runif(36, 1, 5))
r.lst[[1]] <- stack(lapply(1:8, function(i) setValues(r1,runif(ncell(r1)))))
r.lst[[2]] <- stack(lapply(1:6, function(i) setValues(r1,runif(ncell(r1)))))
r.lst[[3]] <- stack(lapply(1:7, function(i) setValues(r1,runif(ncell(r1)))))

Я могу легко рассчитать разницу для каждого отдельного слоя в каждом трех растровом стеке в r.lst[[i]], как показано ниже:

# compute the difference between max and min
x1 <- list()
x2 <- list()
xx <- list()

for (i in 1:length(r.lst)) {
  x1[[i]] <- max(r.lst[[i]])
  x2[[i]] <- which.max(r.lst[[i]])
  x <- list()
  for (j in 1:nlayers(r.lst[[i]])){
    x[[j]] <- x1[[i]]-r.lst[[i]][[j]]
  }
  xx[[i]] <- stack(x)
  print(i)
}

par(mfrow=c(1,4), oma=c(0,0,0,1), mai=c(0.7,0.4,0.7,0.4))
plot(r.lst[[1]][[1]], main="Input.Raster")  #Input from stack
plot(x1[[1]], main="Max")                   #Max of stack
plot(x2[[1]], main="Max.Index")             #Index of Max value in raster stack
plot(xx[[1]][[1]], main="Results")          #OUTPUT (not what I wanted)

enter image description here

Но это не то, что я хочу.Мне нужно учитывать which.max(r.lst[[i]]) в каждом раунде вычислений, чтобы, если индекс рассматриваемого слоя был больше, чем индекс which.max(r.lst[[i]]), мы вычисляли разницу, если нет, мне нужно вычислять разницу с учетом более раннего максимального слоя.Просто расчет для каждого растрового слоя действителен только по сравнению с его предыдущим максимумом, а не следующим.

1 Ответ

1 голос
/ 03 мая 2019

Я полагаю, вы ищете что-то вроде ниже.

Пример данных

library(raster)
set.seed(123)
r <- raster(res = 0.5, xmn = -1.5, xmx = 1.5, ymn = -1.5, ymx = 1.5)
r.lst <- list()
r.lst[[1]] <- stack(lapply(1:8, function(i) setValues(r, runif(ncell(r)))))
r.lst[[2]] <- stack(lapply(1:6, function(i) setValues(r, runif(ncell(r)))))
r.lst[[3]] <- stack(lapply(1:7, function(i) setValues(r, runif(ncell(r)))))

Решение

xx <- list()
for (i in 1:length(r.lst)) {
    xx[[i]] <- cummax( r.lst[[i]] ) -  r.lst[[i]]
}

То есть вы можете использовать cummax для получения максимального значения предыдущих значений (включая текущее значение))

x <- c(1:3, 3:1, 4, 3)
cummax(x)
#[1] 1 2 3 3 3 3 4 4
x - cummax(x)
#[1]  0  0  0  0 -1 -2  0 -1
...