我有181每日ndvi光栅堆叠。我想找到每个像素的峰值,然后分配峰值到其余的。原始数据曲线:
这就是我想要的
这个结果是为单个像素。我已经在excel中做了,但要创建一个代码中的R轻松。现在每个像素达到峰值在不同的日期(所以不同的层堆栈)。
我就是这么试的
fn <- list.files(pn, '*.tif$', full.names = TRUE)
rn <- lapply(fn, raster)
bn <- brick(rn)
for (j in 1:ncell(bn)) {
x <- bn[j]
y <- which.max(x)
x[y:length(x)] <- x[y]
}
现在,如果我不使用循环,这段代码就可以工作。错误可能是因为一些单元格有NA。每层有24个单元格,只有14个有数据。其余的被屏蔽。
2条答案
按热度按时间nvbavucw1#
对于处理栅格数据,我建议使用
terra
包。它是raster
包的更新,速度更快,在大多数情况下更易于使用(你可以用install.packages('terra')
安装它)。terra
有一组apply
函数,允许你在每一堆像素上应用函数。在下面的例子中,我使用一些虚拟数据创建了一个2x2像素的光栅,并使用terra::app
函数执行您在问题中概述的过程:创建于2023年1月18日,使用reprex v2.0.2
h9a6wy2h2#
如果希望曲线永远不会下降,可以使用
terra::cummax
示例数据
溶液
图示为四个单元格