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',但你可以使用 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
的第二个参数是重分类的'matrix',值为"from"、"to"、"new value".
在我们的例子中,这意味着从 -Inf 到 0 的所有值将被重新编码为 666,而 0 到 666 之间的所有值将被重新编码为 0。
参数right=FALSE
表示区间向右开,所以0不会被重新编码为666,666也不会被重新编码为0。
这正是您对问题中的逻辑索引所做的...这意味着所有已经为 0 的值将保持为 0。所有大于 666 的值将保持其原始值。
关于我的时间序列分析,我有一个非常具体的问题要问你 - 希望你能帮助我!我已经检查了各种方法的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',但你可以使用 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
的第二个参数是重分类的'matrix',值为"from"、"to"、"new value".
在我们的例子中,这意味着从 -Inf 到 0 的所有值将被重新编码为 666,而 0 到 666 之间的所有值将被重新编码为 0。
参数right=FALSE
表示区间向右开,所以0不会被重新编码为666,666也不会被重新编码为0。
这正是您对问题中的逻辑索引所做的...这意味着所有已经为 0 的值将保持为 0。所有大于 666 的值将保持其原始值。