在R中优雅地更改多个栅格单元格的值

4
我有一份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] <- 1会产生错误时,每个值都必须单独输入。就像我说的,我的代码是可以工作的。但我只是想成为更好的R语言编程人员。

谢谢。

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]

这个特别好用,因为 x 是离散值。如果是连续变量的话,你的方法会更加有效。 - Paul Hiemstra
谢谢你的提示。非常好用!似乎这种方法也适用于向量、数据框等。不知何故,我找不到关于%in%的R帮助文章——有什么建议的阅读材料可以更好地理解吗?再次感谢。 - vitale232
?'%in%'会为您获取文档(请注意引号)。 - Paul Hiemstra

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)

3

使用逻辑运算符&可以省去一些打字,例如:

x[ x >= 10 & x <= 15 ] <- 1
x[ x >= 16 & x <= 19 ] <- 2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接