离散化R中堆栈中的所有栅格

问题描述 投票:0回答:1

我正在尝试同时将R中的5个堆叠栅格离散化为四分位值。我已经编写了以下循环来执行此操作,但是它似乎无法正常工作。在代码中,“ stack.disc”是堆栈,“四分位数”是5列数据帧,其中5个栅格为列,其四分位数值列在行中。

for(i in 1:ncol(quartiles)) {
  for(j in 1:length(stack.disc@layers[[i]])) {
    if(isTRUE(stack.disc@layers[[i]]@data@values[j] >= quartiles[1,i] &
                stack.disc@layers[[i]]@data@values[j] < quartiles[2,i])) {
        stack.disc@layers[[i]]@data@values[j] = 1 
    }
    if(isTRUE(stack.disc@layers[[i]]@data@values[j] >= quartiles[2,i] &
                stack.disc@layers[[i]]@data@values[j] < quartiles[3,i])) {
        stack.disc@layers[[i]]@data@values[j] = 2
    }
    if(isTRUE(stack.disc@layers[[i]]@data@values[j] >= quartiles[3,i] &
                stack.disc@layers[[i]]@data@values[j] < quartiles[4,i])) {
        stack.disc@layers[[i]]@data@values[j] = 3
    }
    if(isTRUE(stack.disc@layers[[i]]@data@values[j] >= quartiles[4,i] &
                stack.disc@layers[[i]]@data@values[j] <= quartiles[5,i])) {
        stack.disc@layers[[i]]@data@values[j] = 4
    }
  }
}

代码只在堆栈的前3个栅格上运行。有任何想法为什么它对后两个无效?

谢谢!

r spatial raster discretization
1个回答
0
投票

您可以使用cut重新分类栅格。

首先,让我们创建一些虚拟数据来演示:

stack.disc = stack(lapply(1:5, function(i) raster(matrix(rnorm(25, i),5,5))))
quartiles = t(quantile(stack.disc))
#         layer.1  layer.2  layer.3  layer.4  layer.5
# 0%   -1.0937068 0.498138 1.142862 2.229032 3.078026
# 25%   0.5171343 1.799564 2.496730 3.108751 4.484395
# 50%   1.1293477 2.099162 2.896269 3.818627 4.939167
# 75%   1.6348539 2.481976 3.615938 4.693733 5.314098
# 100%  2.4405652 3.511051 4.886970 5.456095 6.929452

现在我们可以使用以下方法将细胞重新分类为四分位数:

s2 = stack(lapply(names(stack.disc), function(n) 
                  cut(stack.disc[[n]], breaks=quartiles[,n])))

结果看起来像这样:

rasterVis::levelplot(s2)

enter code here

或者,使用stackApply的版本略短

s2 = stackApply(stack.disc, 1:5, function(r, na.rm) cut(r, breaks=quartiles[,names(r)]))
© www.soinside.com 2019 - 2024. All rights reserved.