我有两个来自两个时间点(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
我想知道是否有一种简单的方法可以实现类似于栅格的方法?预先谢谢你。
答案 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]
中发生的事情。