require(raster) # make 2 dummy rasters, different extents but same origin and resolution. Values 1:6 slope <- raster(xmn = 0, xmx = 5, ymn = 0, ymx = 5, res = 1) slope[] <- sample(1:6, ncell(slope), replace = T) soil <- raster(xmn = 0, xmx = 7, ymn = -1, ymx = 4, res = 1) soil[] <- sample(1:6, ncell(soil), replace = T) # create your blank raster to populate. This is only the area both inputs occupy. r_intersec <- raster(intersect(slope,soil)) # The other 2 rasters should be cropped to the extent of your target raster, to avoid extent errors as mentioned in the comments croped_slope <- crop(slope,extent(r_intersec)) croped_soil <- crop(soil,extent(r_intersec)) tmp <- croped_slope tmp[which(croped_soil[] <= 0)] <- NA par(mfrow=c(1,3)) plot(slope) plot(soil) plot(tmp) *raster sample and crop idea from https://gis.stackexchange.com/a/328883/77836