Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 有条件地计算max(光栅)和光栅堆栈的每个光栅层之间的差异_R_List_Max_Raster - Fatal编程技术网

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