Вам нужна функция, которая использует только векторизованные операторы.Это тот случай, когда булева арифметика должна быть успешной и более эффективной
myFun <- function(x,y){ 0*(x==0 && y==0)+
2*(x==1 && y==0)+
y*(x==1 && y>0) }
Существуют некоторые крайние случаи, которые не отображаются как покрытые.Может ли x
быть значением, отличным от 0 или 1?Может ли y
когда-нибудь быть отрицательным?
После запуска моей версии я получаю:
> ( res <- overlay(stack(raster_1 ,raster_2), fun = Vectorize(myFun) ) )
class : RasterLayer
dimensions : 2958, 1642, 4857036 (nrow, ncol, ncell)
resolution : 500, 500 (x, y)
extent : -171063.8, 649936.2, 5317253, 6796253 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs
data source : in memory
names : layer
values : 0, 14751 (min, max)
Я не думал, что мне нужно будет использовать Vectorize
вокруг myFun
, enter code here
но результаты, скорее всего, будут правильными, когда я оставлю это в вызове overlay
:
> Hmisc::describe(values(res))
values(res)
n missing distinct Info Mean Gmd .05 .10 .25
3222508 1634528 1502 0.727 4918 6403 0 0 0
.50 .75 .90 .95
0 13898 14082 14168
Value 0 13000 13200 13400 13600 13800 14000 14200 14400
Frequency 2089448 67 578 10515 69031 249817 523241 226628 46191
Proportion 0.648 0.000 0.000 0.003 0.021 0.078 0.162 0.070 0.014
Value 14600 14800
Frequency 6876 116
Proportion 0.002 0.000
Когда я выполнил шаг Vectorize, я не получил ошибку, но я получил все нули,вместо этого.