使用 for 循环和 seq 对栅格进行重新分类

Reclassify raster with for loop and seq

我想用 for loop 基于 seqraster packagereclassify function 对栅格进行重新分类,以下代码的输出为空,我不知道不明白为什么。

#create a random raster
sam <- sample(seq(0,1,0.01), 1000*1000, replace = TRUE)
r1 <- raster(nrows = 1000, ncols = 1000, vals = sam)

#create the scale for reclassify
scale <- seq(0,1,0.2)

#the for loop
cl_r <- for (i in 1:length(scale)){
  reclassify(r1, c(scale[i], scale[i+1], scale[i+1]))
}

输出:

> cl_r
NULL

我想 R 可以理解 scale[i+1],因为 scale[1+1] 有效。

根据您的问题,我推断您的数字介于 0 和 1 之间,并且希望将这些数字分组为 0.2(0 到 0.2、0.2 到 0.4 等)。如果是这样,有很多方法可以做到这一点。

示例数据

library(raster)
r <- raster(nrows=10, ncols=10)
#values(r) <- runif(ncell(r))
values(r) <- seq(0.01, 1, .01)

最简单的方法是使用 cut

x <- cut(r, seq(0,1,.2))

您可以像这样使用重新分类

m <- cbind(seq(0,.8,.2), seq(0.2,1,.2), 1:5)
y <- reclassify(r, m)

或代数方法

z <- ceiling(r * 5)

此外,如果您要像那样循环 scale,请注意最后会得到 NA

scale <- seq(0,1,0.2)
for (i in 1:length(scale)) { 
    cat(scale[i], "-", scale[i+1], "\n")
}
#0 - 0.2 
#0.2 - 0.4 
#0.4 - 0.6 
#0.6 - 0.8 
#0.8 - 1 
#1 - NA 

这样做会更干净

for (i in 2:length(scale)) { 
    cat(scale[i-1], "-", scale[i], "\n")
}
#0 - 0.2 
#0.2 - 0.4 
#0.4 - 0.6 
#0.6 - 0.8 
#0.8 - 1 

想必您的意图是

rc <- r
for (i in 2:length(seq(0,1,0.2))) {
     rc <- reclassify(rc, cbind(scale[i-1], scale[i], scale[i])) 
}
rc