R 如何在每个图层的栅格堆栈列表中分配像素值?

R How to reassign pixel values in a list with rasterstacks in every single layer?

关于我的时间序列分析,我有一个非常具体的问题要问你 - 希望你能帮助我!我已经检查了各种方法的Whosebug,但我失败了。

我有一个包含 12 个元素的巨大列表。该列表中的每个元素都代表一个由 16 个栅格层组成的栅格堆栈。现在我想重新分配这个列表中每一层的值。我不知道如何在 for 循环或类似的东西中做到这一点,因为我必须追逐列表中的每一层以重新分配值。

到目前为止,我得到的结果如下所示:

list_monthly_stack
[[1]]
class       : RasterStack 
dimensions  : 26, 42, 1092, 16  (nrow, ncol, ncell, nlayers)
resolution  : 0.04, 0.04  (x, y)
extent      : 76.4, 78.08, 51.32, 52.36  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
names       : CCS_1m200301, CCS_1m200401, CCS_1m200501, CCS_1m200601, CCS_1m200701, CCS_1m200801, CCS_1m200901, CCS_1m201001, CCS_1m201101, CCS_1m201201, CCS_1m201301, CCS_1m201401, CCS_1m201501, CCS_1m201601, CCS_1m201701, ... 
min values  :           26,           35,           24,           59,           37,           18,          107,           52,           20,            8,           73,           33,           47,           49,           73, ... 
max values  :          139,          193,          123,          369,          173,          198,          299,          324,          270,          175,          198,          181,          138,          236,          299, ... 
# this is how one list element looks like

要追踪 rasterstack/list 元素的图层以应用所需的操作,我可以执行以下操作:

test <- list_monthly_stack[[1]][[1]]
test[test < 0] <- 666
test[test > 0 & test < 666] <- 0

但是因为我必须这样做 12*16 次,所以我想在 for 循环或类似的东西中自动化所描述的过程。你知道如何解决这个问题吗?非常感谢!

虽然我不同意你的列表是 'huge',但你可以使用 lapplyreclassify 来获得你需要的东西。

lapply 只是像任何 for 循环一样遍历列表,但被包裹在一个漂亮而整洁的函数中。

首先,让我们得到一个可重现的数据集:

library(raster)

r <- raster(nrow=26,ncol=42)

set.seed(42)

list_monthly_stack <- lapply(1:12,function(i) do.call(stack,replicate(16,setValues(r,runif(ncell(r))))))

现在进行重新分类:

list_monthly_stack_rc <- lapply(list_monthly_stack, function(x) reclassify(x,c(-Inf,0,666,0,666,0),right=FALSE)

reclassify的第二个参数是重分类的'matrix',值为"from"、"to"、"new value".

在我们的例子中,这意味着从 -Inf 到 0 的所有值将被重新编码为 666,而 0 到 666 之间的所有值将被重新编码为 0。

参数right=FALSE表示区间向右开,所以0不会被重新编码为666,666也不会被重新编码为0。

这正是您对问题中的逻辑索引所做的...这意味着所有已经为 0 的值将保持为 0。所有大于 666 的值将保持其原始值。