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

时间:2019-09-05 13:37:50

标签: r for-loop raster seq

我想根据for loop中的seqreclassify functionraster package的栅格重新分类,以下代码的输出为空,我不明白为什么。

#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

我想scale[i+1]可以使R理解scale[1+1]

1 个答案:

答案 0 :(得分:2)

从您的问题中推断出您的数字在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