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

Multiple if-else for raster data in R

我有两个光栅如下

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, nrow=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 <= a <= 0.5 时,新光栅像素的值应为 1.70。

如何在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, 0.2, 1.5, 0.2, 0.5, 1.7, 0.5, Inf, 1.85), ncol=3, byrow=TRUE)
x <- reclassify(a, m)

一种效率较低的方法,使用 cut(正如 SteveM 使用的那样)

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

Val 的解决方案有效,但它更适合交互式探索,而不是在脚本中使用。