我有一个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程序员。
谢谢。
您可以使用%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]
我会使用重分类函数
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)
使用&
逻辑运算符可以节省一些输入,例如
x[ x >= 10 & x <= 15 ] <- 1
x[ x >= 16 & x <= 19 ] <- 2