有条件地计算 max(raster) 与栅格堆栈的每个栅格层之间的差异
Conditionally calculating the difference between max(raster) and each raster layer of raster stack
我有一个名为 r.lst
的栅格堆栈列表。我需要计算 max(r.lst[[i]])
(堆叠栅格)与该栅格堆栈的每个栅格层之间的差异。但是,我想通过考虑 which.max(r.lst[[i]])
为每个像素有条件地执行此操作。这样每个单元格都从其 previous 最大值中扣除,而不是下一个。请看下面的例子:
# 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)
但这不是我想要的。我需要在每一轮计算中考虑 which.max(r.lst[[i]])
以便如果正在考虑的层的索引大于 which.max(r.lst[[i]])
的索引我们计算差异,如果不是我需要计算之前考虑的差异最大层。简单地说,每个栅格层的计算仅与其早期的最大值相比才有效,而不是下一个。
我相信您正在寻找类似下面的内容。
示例数据
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
我有一个名为 r.lst
的栅格堆栈列表。我需要计算 max(r.lst[[i]])
(堆叠栅格)与该栅格堆栈的每个栅格层之间的差异。但是,我想通过考虑 which.max(r.lst[[i]])
为每个像素有条件地执行此操作。这样每个单元格都从其 previous 最大值中扣除,而不是下一个。请看下面的例子:
# 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)
但这不是我想要的。我需要在每一轮计算中考虑 which.max(r.lst[[i]])
以便如果正在考虑的层的索引大于 which.max(r.lst[[i]])
的索引我们计算差异,如果不是我需要计算之前考虑的差异最大层。简单地说,每个栅格层的计算仅与其早期的最大值相比才有效,而不是下一个。
我相信您正在寻找类似下面的内容。
示例数据
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