R 基于2个光栅对光栅进行重新分类

R 基于2个光栅对光栅进行重新分类,r,gis,raster,R,Gis,Raster,我在R中有两个具有相同空间范围的光栅r1和r2,我想创建一个以r1和r2中的值为条件的光栅r3。我可以设置一个矩阵并使用raster::reclassify,但我只能使用其中一个光栅来完成这项工作。我正在寻找一种在两个光栅上执行此操作的有效方法。例如,如果r1=0且r22,r3=0.9,我还有几个条件要在实际数据上使用。下面是代码形式的示例 library(raster) # create two random rasters r1 <- raster(matrix

我在R中有两个具有相同空间范围的光栅r1和r2,我想创建一个以r1和r2中的值为条件的光栅r3。我可以设置一个矩阵并使用raster::reclassify,但我只能使用其中一个光栅来完成这项工作。我正在寻找一种在两个光栅上执行此操作的有效方法。例如,如果r1=0且r2<2,r3=0.5,请参见下文,但如果r1=1且r2<2,则r3=0.8。如果r1=0,r2>2,r3=0.7,但是如果r1=1,r2>2,r3=0.9,我还有几个条件要在实际数据上使用。下面是代码形式的示例

    library(raster)
    # create two random rasters
    r1 <- raster(matrix(rbinom(16, size=1, prob=.5), nrow=4))
    r2 <- raster(matrix(rpois(16, 2), nrow=4))
    # check that spatial extent is the same
    extent(r1) == extent(r2)

    # here is a reclassify matrix if r1==1
    reclass_m1 <- matrix(
      c(0,2,.8,
        3,5,.9
     ), ncol=3, byrow=TRUE
    )
    # reclassify matrix if r1==0
    reclass_m0 <- matrix(
      c(0,2,.5,
        3,5,.7
      ), ncol=3, byrow=TRUE
    )

    # so if r1==1,  I would want 
    r3 <- reclassify(r2, reclass_m1)

    # if r1==0, I would want 
    r3 <- reclassify(r2, reclass_m0)
    # but I want a single r3 that does this process consistently. 
我看了其他类似的问题,没有找到我想要的解决方案。我提前感谢你的帮助

如果r1和r2具有可比性,则可以使用逻辑索引。如果您有一吨或不同数量的条件,这可能会有点乏味,但对于本例来说,它确实有效:

library(raster)
# create two random rasters
r1 <- raster(matrix(rbinom(16, size=1, prob=.5), nrow=4))
r2 <- raster(matrix(rpois(16, 2), nrow=4))
# check that spatial extent is the same
extent(r1) == extent(r2)

plot(r1)
plot(r2)

# create r3 from r1
r3 <- raster(r1)

# fill based on conditions

r3[r1 == 0 & r2 < 2] <- 0.5
r3[r1 == 1 & r2 < 2] <- 0.8
r3[r1 == 0 & r2 > 2] <- 0.7
r3[r1 == 1 & r2 > 2] <- 0.9


r3

# class       : RasterLayer 
# dimensions  : 4, 4, 16  (nrow, ncol, ncell)
# resolution  : 0.25, 0.25  (x, y)
# extent      : 0, 1, 0, 1  (xmin, xmax, ymin, ymax)
# coord. ref. : NA 
# data source : in memory
# names       : layer 
# values      : 0.7, 0.8  (min, max)

谢谢你@Val!这适用于模拟数据。我的大锉刀有问题,所以我在等着看它对它们是否有效,但它应该有效。通过创建定义感兴趣的值的向量,然后在循环中建立索引,可以避免一些繁琐的工作。@mikey如果你的光栅真的很大,你可以实现分块解决方案更新:我得到了这一点,可以在不分块的情况下处理大光栅。作为参考,整个北美的光栅分辨率均为30x30 m。按照上面@Val的解决方案使用逻辑索引在一台速度较慢的笔记本电脑8GB Ram上花费了大约30分钟。