howdidienduphere
howdidienduphere

Reputation: 43

create new raster from raster using if statement in R

I have a raster layer showing SST during present, but only showing pixels where I know is suitable habitat for a species. All other pixels are set NA.

Now I have the same raster layer, but showing predicted SST for 2050. In this raster layer, all pixels have a value (except NA on land surfaces).

Now I want to do the following: I want to search the second raster layer for the values given in the first raster layer and set all other values 0. So the result should be a raster showing only pixels which have values that can also be found in the first raster.

I think the right function to use would be if else function.

Is there a way to use all values of a raster in an if else function? The code should be something like the following then:

    if(raster1==raster2){
      raster3 <- 1
      }else{
      raster3 <- 0
      }

Upvotes: 0

Views: 544

Answers (2)

howdidienduphere
howdidienduphere

Reputation: 43

I found the answer to my question:

check <- raster2<maxValue(raster1)
raster_final <- check*raster2
raster_final_2 <- mask(raster2, check, maskvalue=0)
raster_final_3 <- crop(raster_final_2, raster1)
raster_final_4 <- mask(raster_final_3, raster1)

Upvotes: 0

Robert Hijmans
Robert Hijmans

Reputation: 47091

Here is some example data, so that the you get a minimal self-contained reproducible example.

library(raster)
s <- r <- raster(ncol=5, nrow=5)
values(r) <- rep(c(1,NA,1,NA,1), 5)
values(s) <- 1:25

You can do what you are after (set all values in s, where r is NA, to 0) like this

x <- mask(s, r, updatevalue=0)

You could also use algebra

y <- (!is.na(r)) * s

There actually is a (hidden) ifel method, but that is less efficient

z <- raster:::.ifel(!is.na(r), s, 0)

Upvotes: 2

Related Questions