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

时间:2019-01-14 11:06:18

标签: r time-series gis raster

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

我有一个包含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

要在栅格堆栈/列表元素的图层上继续进行以应用所需的操作,我可以执行以下操作:

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

但是由于我必须做12 * 16次,所以我想以for循环或类似的方式自动化所描述的过程。您有解决该问题的想法吗?提前非常感谢!

1 个答案:

答案 0 :(得分:0)

虽然我很不同意您的列表“太大”,但是您可以使用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的第二个参数是用于重新分类的“矩阵”,其值为“从”,“至”,“新值”。

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

自变量right=FALSE表示该间隔将在右侧打开,因此0将不会被重新编码为666,666将不会被重新编码为0。

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