R 有条件地计算max(光栅)和光栅堆栈的每个光栅层之间的差异
我有一个名为R 有条件地计算max(光栅)和光栅堆栈的每个光栅层之间的差异,r,list,max,raster,R,List,Max,Raster,我有一个名为r.lst的光栅堆栈列表。我需要计算max(r.lst[[I]])(堆叠光栅)和该光栅堆栈的每个光栅层之间的差异。但是,我想通过考虑哪个.max(r.lst[[I]])有条件地对每个像素执行此操作。因此,中的每个单元格将从其上一个最大值中扣除,而不是从下一个中扣除。请参见以下示例: # example data------------------------------------------- set.seed(123) #our list of rasters r.lst <
r.lst
的光栅堆栈列表。我需要计算max(r.lst[[I]])
(堆叠光栅)和该光栅堆栈的每个光栅层之间的差异。但是,我想通过考虑哪个.max(r.lst[[I]])
有条件地对每个像素执行此操作。因此,中的每个单元格将从其上一个最大值中扣除,而不是从下一个中扣除。请参见以下示例:
# 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)))))
但这不是我想要的。在每一轮计算中,需要考虑<代码> .max(r.LSt[[i]),这样如果所考虑的层的索引大于<代码>的索引。max(r.LSt[[i])< /C>我们计算差异,如果没有,则需要考虑较早的最大层的差异。简单地说,每个光栅层的计算仅在与之前的最大值相比时有效,而不是与下一个最大值相比有效。我相信您正在寻找类似于以下内容的内容 示例数据
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)))))
TL;DR.但我的第一印象是,您只需要一个附加变量
max
,该变量在for循环之前启动,并且仅当max(r.lst[[i]])>max
时,才会在每次迭代中增加。还是这不是你想要的?@symbolrush谢谢你的帮助。这不是我想要的。该条件将基于which.max(r.lst[[i]])
和r.lst[[i]][[j]]
索引本身的相应单个光栅单元。简单的max(r.lst[[i]]]>max
在这里没有真正的帮助。谢谢Rob。我不知道cummax的事。那么,为什么所有堆栈的第一个光栅始终为空?我已尝试使用Max.Index
光栅从脚本中屏蔽每个xx
,以仔细检查值,您的解决方案工作正常。但是,我对每个堆栈的第一个光栅始终为空感到困惑。第一层只有零,因为输入的第一层的值始终与仅考虑该层时的最大值相同。由于没有早期值(图层),因此不能考虑其他值。
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]]
}
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