关于我的时间序列分析,我有一个非常具体的问题要给您-希望您能帮帮我!我已经检查了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循环或类似的方式自动化所描述的过程。您有解决该问题的想法吗?提前非常感谢!
答案 0 :(得分:0)
虽然我很不同意您的列表“太大”,但是您可以使用lapply
和reclassify
来获取所需的内容。
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的值将保留其原始值。