使用 for 循环和 seq 对栅格进行重新分类
Reclassify raster with for loop and seq
我想用 for loop
基于 seq
和 raster package
的 reclassify 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