R中的栅格数据的多个if-else

问题描述

我有两个栅格,如下所示

library(raster)

a <- brick(ncol=100,nrow=100,nl=1)
set.seed(2)     
values(a) = runif(10000,min=-1,max=1)    # define the range between -1 and 1

b <- brick(ncol=100,nl=1)
set.seed(2)     
values(b) = runif(10000,min=25,max=35)

现在,我想基于多个条件创建一个新的栅格。条件就像

当a = 0-0.2时,新的栅格像素的值应为1.5;

当a> 0.5时,新的栅格像素应具有1.85的值;

当0.2

如何在R中实现它?

解决方法

您可以使用剪切功能:

breaks <- c(-Inf,0.2,0.5,Inf)
labels <- c(1.5,1.70,1.85)
pixels <- cut(values(a),breaks = breaks,labels = labels)
pixels <- as.character(pixels)
pixels <- as.numeric(pixels)
首先将

pixels转换为character,因为将pixel factors转换为numeric会将它们直接舍入为整数。可能有一种更干净的方法可以做到这一点。

顺便说一句,这是值的摘要(a)

summary(values(a))
     layer          
 Min.   :-0.999954  
 1st Qu.:-0.500247  
 Median : 0.011779  
 Mean   : 0.006613  
 3rd Qu.: 0.506796  
 Max.   : 0.999927  

请注意,负值的最大值为0.999927,因此与您定义的中断值不一致。

,

只要您的栅格在空间上相同,就可以使用简单的布尔索引:

# create empty copy
c <- raster(b)


c[(a >= 0) & (a < 0.2)] <- 1.5
c[(a >= 0.2) & (a <= 0.5)] <- 1.85
c[a > 0.5] <- 1.70

这适用于b副本。如果要保留原始值,可以使用b代替c

,

您可以reclassify

library(raster)
a <- brick(ncol=100,nrow=100,nl=1)
set.seed(2)     
values(a) <- runif(ncell(a),min=0,max=1)   
m <- matrix(c(0,1.5,1.7,Inf,1.85),ncol=3,byrow=TRUE)
x <- reclassify(a,m)

使用cut(如SteveM所使用的那样)是一种效率较低的方式

y <- cut(a,c(0,1))
z <- subs(y,data.frame(from=1:3,to=c(1.5,1.85)))

Val的解决方案有效,但更多用于交互式探索,而不是用于脚本。