2015-06-05 34 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

我猜测它可能是非常硬件且可能依赖于数据的行为。但要注意的是,我在一台机器上运行上面的代码,其中内存不受任何重要方面的限制,因此我认为这不是一个大问题。这就是说,没有深入细节,我不能说真话。 –