在R中雄辩地更改许多栅格单元格值

时间:2013-04-24 06:43:03

标签: r gis spatial raster

我有一个Landfire现有植被数据集(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]&lt; - 1产生错误,所以每个值都必须单独输入。正如我所说,我的代码有效。但我只想成为一名更好的R编码员。

感谢。

3 个答案:

答案 0 :(得分:4)

您可以使用%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]

答案 1 :(得分:3)

使用&逻辑运算符(例如

)可以节省一些输入
x[ x >= 10 & x <= 15 ] <- 1
x[ x >= 16 & x <= 19 ] <- 2

答案 2 :(得分:3)

我会使用重新分类功能

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)