在r中叠加栅格以使用ifelse满足三种不同的条件

时间:2016-01-15 19:53:14

标签: r if-statement overlay r-raster

我正在尝试使用栅格运行叠加功能,我希望在每个单元格中使用==><运算符来满足所有3种不同的条件并生成单个栅格作为输出。

使用ifelse运算符运行&似乎从左到右以线性方式查看条件 - 如果满足前两个条件,那么它将生成if条件作为输出,无论如何第三个条件。此处不能使用&&,因为结果未向量化。

您可以通过下面的示例看到这一点,在结果栅格中,很明显它没有评估所有三个参数。第一个线索是,即使某些值在第三个栅格中为NA,它也会产生结果。

我想我可以通过首先检查x和y的条件得到我想要的结果然后用这个结果分别用不同的函数检查z的条件,但我希望能够在一个中完成所有这一切功能(看起来这应该是可能的,至少)。

希望有人能指出我正确的方向。

library(raster)
fn <- system.file("external/test.grd", package="raster")
  s <- stack(fn, fn,fn)
  #Create grids
  s[[1]] <- round(runif(ncell(s), 1, 2))
  s[[2]] <- round(runif(ncell(s), 1, 2))
  s[[3]] <- round(runif(ncell(s), 1, 2))
  #convert some values in s[[3]] to NA
  s[[3]][s[[3]] == 1]<- NA

  #run overlay function
  result.rast <- overlay(s[[1]], s[[2]], s[[3]], fun =   
  function(x,y,z) { 
        ifelse( x == 2 & y == 1 & z ==2, 1, 0) 
  } )

2 个答案:

答案 0 :(得分:0)

你试过stackApply吗?

您还可以将栅格堆栈的每个图层用作矢量。 这是一个例子(虽然可能是引用rasterStack中单元格的更好方法)

tt <- raster(ncol=4,nrow=5)
tt[] <- 1
tts <- stack(tt,tt,tt)
tts[[1]][4,2]<-NA
# now the condition
tt2 <- (tts[[1]] == 1 & tts[[2]] == 1 & tts[[3]] == 1)
plot(tt2)

答案 1 :(得分:0)

我没有看到没有使用第三个条件的证据。 NA值是一种特殊情况。有关您可以执行的操作,请参阅函数f2

使用较小的栅格

更容易看到发生了什么
library(raster)
set.seed(0)
r <- raster(ncol=10, nrow=10, xmn=0, xmx=10, ymn=0, ymx=10)
r1 <- setValues(r, round(runif(ncell(r), 1, 2)))
r2 <- setValues(r, round(runif(ncell(r), 1, 2)))
r3 <- setValues(r, round(runif(ncell(r), 1, 2)))
r3[r3 == 1] <- NA
s <- stack(r1, r2, r3)


res1 <- overlay(s, fun =   
  function(x,y,z) { 
        ifelse( x == 2 & y == 1 & z ==2, 1, 0) 
  } )


#A more complex function, that keeps NAs

f2 <- function(x,y,z) {
    a <- rep(0, length(x))
    a[x == 2 & y == 1 & z ==2] <- 1
    a[is.na(x) | is.na(y) | is.na(z)] <- NA
    a 
} 

res2 <- overlay(s, fun = f2)