【问题标题】:Discretize all rasters in stack in R在R中离散化堆栈中的所有栅格
【发布时间】:2020-06-22 22:21:50
【问题描述】:

我正在尝试同时将 R 中的 5 个堆叠栅格离散化为四分位数。为此,我编写了以下循环,但它似乎无法正常工作。在代码中,“stack.disc”是堆栈,“quartiles”是一个 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 个栅格上运行。任何想法为什么它不适用于最后 2 个?

谢谢!

【问题讨论】:

  • 也许您应该使用一个包含多个 else if ... 的语句,而不是五个单独的 if ... 语句

标签: r spatial raster discretization


【解决方案1】:

您可以使用cut 重新分类栅格(它有一个 raster* 方法)。

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

或者,使用stackApply的略短版本

stackApply(stack.disc, 1:5, function(r, na.rm) cut(r, breaks=quartiles[,names(r)]))

一些可重现的数据来证明:

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

【讨论】:

  • 更简单、更简洁,谢谢!我早些时候在我的代码中发现了一个错误,阻止了两个栅格被正确处理(对于我的代码和你的代码),但是在发现它之后它就起作用了。非常感谢。
  • 不客气。为了将来参考,如果您发现自己尝试直接访问光栅槽(@ 运算符),这是一个危险信号,几乎可以肯定,使用 raster 包中的其他函数可以使用更简单的清洁方法。
猜你喜欢
  • 2020-04-30
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 2014-11-01
  • 2019-11-21
  • 2021-02-13
相关资源
最近更新 更多