2016-01-15 88 views
0

我试图运行与我想要满足所有3个不同的条件,在每个单元格光栅叠加功能(使用==><运营商),以满足三个不同的条件和产生单个光栅作为输出。覆盖栅格使用ifelse

运行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) 
    }) 

回答

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) 
+0

我应该更清楚地知道NA值是我考虑的一个重要因素。我想要发生的是,如果它正在考虑的任何单元是NA,则函数不能计算出一个值(即返回NA)。在经过初始条件之后,RobertH的'f2'实质上是这样做的。非常感谢大家。 – DJ77

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) 
+0

感谢。我尝试了上面的代码,但修改它以匹配上面代码中我想要满足的栅格和条件。 'tt2 < - (s [[1]] == 2&s [[2]] == 1&s [[3]] == 2)'所以在我看来,它没有什么不同。从阅读堆栈应用程序帮助听起来像我的功能需要能够使用'na.rm',但我写的功能不是。这可能是我的问题,如果我可以使用'na.rm'作为我的条件的一部分我的问题可以得到解决...... – DJ77

+0

什么意思哟用“它没有做任何事情不同”?在最终栅格的位置[4,2]中你仍然得到非NA值吗? –