4

我有一个 Landfire Existing Vegetation 数据集 ( http://www.landfire.gov/ ),我已将其投影并裁剪到我的研究地点。栅格有大约 12,000,000 个像元。像元值代表特定的植被类型,值范围为 16:2200。所有这些值都没有出现在我的研究区域中(即值从 20 跃升至 1087)。

由于我的目的可以将许多像素值归为一个分类(例如,将不同的灌木群落归为一类),我想将栅格的值重置为更简单的值(1:11)。这将有助于按植被类型从其他栅格轻松提取数据,并便于绘制分类图。我有一个工作代码,但需要大量输入才能更改我需要更改的所有 61 个值。这是我所做的:

#===============================
############Example#############
#===============================

library(raster)
r <- raster(nrows=30, ncols=10, xmn=0, xmx=10)
r[] <- rep(10:19, 30)

r.omance <- function(x){
            x[x==10] <- 1; x[x==11] <- 1; x[x==12] <- 1
            x[x==13] <- 1; x[x==14] <- 1; x[x==15] <- 1

            x[x==16] <- 2; x[x==17] <- 2; x[x==18] <- 2
            x[x==19] <- 2
            return(x)}

reclass <- calc(r, fun = r.omance) 

有谁知道更简单的方法来解决这个问题?您可以想象输入会更改 61 个值,特别是因为 x[x==16:20] <- 1 会产生错误,因此必须单独输入每个值。正如我所说,我的代码有效。但我只想成为一个更好的 R 编码器。

谢谢。

4

3 回答 3

6

你可以使用%in%

x %in% c(1,4,3:10)

这个:

x[x==10] <- 1; x[x==11] <- 1; x[x==12] <- 1
x[x==13] <- 1; x[x==14] <- 1; x[x==15] <- 1

将减少为:

x[x %in% 10:15]
于 2013-04-24T06:55:27.863 回答
4

我会使用重新分类功能

library(raster)
r <- raster(nrows=30, ncols=10, xmn=0, xmx=10)
r[] <- rep(10:19, 30)
rc <- matrix(c(10,15,1,16,19,2), ncol=3, byrow=TRUE)
x <- reclassify(r, rc, right=NA)
于 2013-12-22T02:52:55.223 回答
3

您将使用&逻辑运算符节省一些打字时间,例如

x[ x >= 10 & x <= 15 ] <- 1
x[ x >= 16 & x <= 19 ] <- 2
于 2013-04-24T06:53:41.083 回答