根据另一个栅格更改一个栅格中的像元值

时间:2018-11-10 20:34:20

标签: r if-statement raster

我有两个来自两个时间点(t1和t2)的栅格地图,每个时刻都有两个土地覆被类别(LC1,LC2)。我想强加一个规则,即t1中的LC2单元不能在t2中更改为LC1单元,即,只有LC1可以随时间更改为LC2,而不能相反。我很难在R中找到一个规则。我想到的是这样的:

#create test rasters
r <- raster(nrows=25, ncols=25, vals=round(rnorm(625, 3), 0)) #land-use/cover raster
r[ r > 2 ] <- 2
r[ r < 1 ] <- 1
r2 <- r
plot(r2) #r2 is t2

r <- raster(nrows=25, ncols=25, vals=round(rnorm(625, 3), 0)) #land-use/cover raster
r[ r > 2 ] <- 2
r[ r < 1 ] <- 1
plot(r) #r is t1

r_fix <- overlay(r, r2, fun = function(x, y) {
  if (x[ x==2 ] & y[ y==1 ]) { #1 is LC1, 2 is LC2
    x[ x==2 ] <- 1 }
  return(x)
})

但是它返回一个错误(因为它们使我将if语句与栅格一起使用?):

Error in (function (x, fun, filename = "", recycle = TRUE, forcefun = FALSE,  : 
  cannot use this formula, probably because it is not vectorized

我想知道是否有一种简单的方法可以实现类似于栅格的方法?预先谢谢你。

1 个答案:

答案 0 :(得分:2)

你真的很亲密

overlay(r, r2, fun = function(x, y) {x[x == 2 & y == 1] <- 1; x})

似乎可以胜任这项工作。

关于您的解决方案,

x[x == 2] <- 1

不会引起任何错误,尽管也不完全是您要使用的情况。但是,

if (x[x == 2] & y[y == 1])

是一个问题,因为x[x == 2] & y[y == 1]返回一个矩阵,而if只需要一个逻辑输入。另一方面,子集可以处理逻辑矩阵,而这正是x[x == 2 & y == 1]中发生的事情。