问题描述
我有两个栅格,如下所示
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的解决方案有效,但更多用于交互式探索,而不是用于脚本。