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 的解决方案有效,但它更适合交互式探索,而不是在脚本中使用。
我有两个光栅如下
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 的解决方案有效,但它更适合交互式探索,而不是在脚本中使用。