2015-06-05 70 views
3

如果我有一個光柵堆棧:條件分析另一層基於價值觀

require(raster) 
r_test <- stack(
    raster(ncols = 10, nrows = 10, vals = sample(c(-1, 0, 1), 100, TRUE)), 
    raster(ncols = 10, nrows = 10, vals = rnorm(100, 7, 0.4) 

我想基於在同一單元的值的函數適用於layer.2layer.1,我該怎麼辦?

作爲一個簡單的例子,在layer.2其中等效電池在layer.1等於-1乘以值。

+0

哼,或許'overlay'可以用於這個? 'overlay(x = r_test [[1]],y = r_test [[2]],fun =函數(x,y)ifelse(x == -1,x * y,y))' –

+0

Thanks @RomanLuštrik。那也是我最終選擇的地方。它有效,所以把它寫成答案! – sinclairjesse

回答

3

一般而言,overlay()函數在許多情況下工作得很好。根據我的經驗,與我第一次刺穿這個答案相反,ifelse()的效率可能更高或更低,特別是對於更大的柵格。對於1000行/列的光柵,簡單的光柵代數將更快。如果我將這個數字提高到10000行/列,那麼ifelse()的調用會更好。

library(raster) 
r_test <- stack(
    raster(ncols = 1000, nrows = 1000, vals = sample(c(-1, 0, 1), 1000000, TRUE)), 
    raster(ncols = 1000, nrows = 1000, vals = rnorm(1000000, 7, 0.4)) 
) 

## While overlay() works this is a more general solution and is 
##  more efficient for large raster data sets: 
system.time(
r_out <- r_test[[1]] * r_test[[2]] * (r_test[[1]] == -1) + r_test[[2]] * (r_test[[1]] != -1) 
) 
# N=1000x1000 cells: 
# user system elapsed 
# 0.05 0.01 0.06 
# N=10000x10000 cells: 
# user system elapsed 
# 48.36 19.60 77.56 

system.time(
r_out <- overlay(x = r_test[[1]], y = r_test[[2]], fun = function(x, y) ifelse(x == -1, x * y, y)) 
) 
# N=1000x1000 cells: 
# user system elapsed 
# 0.53 0.08 0.64 
# N=10000x10000 cells: 
# user system elapsed 
# 19.77 5.82 26.53 
+0

奇怪,不是嗎?爲什麼會這樣? – sinclairjesse

+0

我猜測它可能是非常硬件且可能依賴於數據的行爲。但要注意的是,我在一臺機器上運行上面的代碼,其中內存不受任何重要方面的限制,因此我認爲這不是一個大問題。這就是說,沒有深入細節,我不能說真話。 –