R 如何使用光栅对象中的值创建图层?

R 如何使用光栅对象中的值创建图层?,r,raster,R,Raster,我有一个光栅对象,每个单元格中包含不同的值,如下例所示: library(raster) x <- matrix(1:5,nrow = 5, ncol = 1) r <- raster(x) plot(r) r > r class : RasterLayer dimensions : 5, 1, 5 (nrow, ncol, ncell) resolution : 1, 0.2 (x, y) extent : 0, 1, 0, 1 (xmin, xm

我有一个光栅对象,每个单元格中包含不同的值,如下例所示:

library(raster)
x <- matrix(1:5,nrow = 5, ncol = 1)
r <- raster(x)
plot(r)

r
> r
class      : RasterLayer 
dimensions : 5, 1, 5  (nrow, ncol, ncell)
resolution : 1, 0.2  (x, y)
extent     : 0, 1, 0, 1  (xmin, xmax, ymin, ymax)
crs        : NA 
source     : memory
names      : layer 
values     : 1, 5  (min, max)
我想知道是否有一种简单的方法可以根据光栅的值创建新图层,从而保留其空间结构

在下面的示例中,我成功地手动实现了这一点,但我认为如果要将多个值转换为层,那么这不是一种有效的方法

l1 <- r
l2 <- r
l3 <- r
l4 <- r
l5 <- r

values(l1)[which(values(r)!=1)] <- 0
values(l2)[which(values(r)!=2)] <- 0
values(l3)[which(values(r)!=3)] <- 0
values(l4)[which(values(r)!=4)] <- 0
values(l5)[which(values(r)!=5)] <- 0

r1 <- stack(l1,l2,l3,l4,l5)
plot(r1)

r1
> r1
class      : RasterStack 
dimensions : 5, 1, 5, 5  (nrow, ncol, ncell, nlayers)
resolution : 1, 0.2  (x, y)
extent     : 0, 1, 0, 1  (xmin, xmax, ymin, ymax)
crs        : NA 
names      : layer.1, layer.2, layer.3, layer.4, layer.5 
min values :       0,       0,       0,       0,       0 
max values :       1,       2,       3,       4,       5 
感谢您的帮助


谢谢

是的,您可以在一行中实现这一点:


r1是的,您可以在一行中实现这一点:


r1有一种方法

x <- layerize(r)
要恢复原始数字,您可以

x <- layerize(r) * unique(r) 
或者可能更明确

u <- unique(r)
x <- layerize(r, classes=u) * u 

x
# (...)
#names      : X1, X2, X3, X4, X5 
#min values :  0,  0,  0,  0,  0 
#max values :  1,  2,  3,  4,  5 

有一种方法可以做到这一点

x <- layerize(r)
要恢复原始数字,您可以

x <- layerize(r) * unique(r) 
或者可能更明确

u <- unique(r)
x <- layerize(r, classes=u) * u 

x
# (...)
#names      : X1, X2, X3, X4, X5 
#min values :  0,  0,  0,  0,  0 
#max values :  1,  2,  3,  4,  5 

谢谢你,艾伦!这是一个非常优雅的解决方案。更优雅和内存安全的变体:StackLapplyUnique,functioni{r[r!=i]@RobertHijmans谢谢你。你能解释一下为什么它有更好的内存安全性吗?我不得不承认我不明白为什么会这样。我很感谢你的见解。[]创建一个包含内存中所有值的向量。如果您有一个非常大的文件或没有太多可用RAM,则可能会失败。光栅方法将改为分块处理文件。@RobertHijmans非常感谢-很高兴知道这一点。谢谢您,Allan!这是一个非常优雅的解决方案。更优雅且内存安全的变体:StackLapplyUnique,functioni{r[r!=i]@RobertHijmans谢谢你。你能解释一下为什么它有更好的内存安全性吗?我不得不承认我不明白为什么会这样。我很感激你的洞察力。[]创建一个包含内存中所有值的向量。如果您有一个非常大的文件或没有太多可用RAM,则可能会失败。光栅方法将改为分块处理文件。@RobertHijmans非常感谢-很高兴知道。谢谢,Robert。这正是我要找的。谢谢,Robert。这正是我要找的。