I imported two rasters (raster A
and B)
in R using the raster
function.
I would like to extract the pixels of A
where B
equals 1 into a data frame.
I am trying the following, however, all the pixels I obtain have the same values, although they are various in the original dataset.
The two rasters have the same dimensions (ncols, nrows, ncell, resolution, extent, projection).
library(raster)
library(rgdal)
# import inputs
A <- raster('/pat/to/rasterA.tif')
B <- raster('/pat/to/rasterB.tif')
# extract raster values from A over raster B where B == 1
mydata <- data.frame(A[B[B == 1]])
EDIT 1
Might be that when I do A[B[B == 1]]
, the class of object A and B from RasterLayer
becomes numeric
, and this creates problems? I discovered this by doing class(A[B[B == 1]])
, which gives numeric
.
EDIT 2
Ok, this is weird. I tried to do mydata <- data.frame(A[B])
and now the output has the original A
only at B == 1
locations. Trying this before it extracted all the pixels from A
(as I would expect). I can coinfirm it is right by counting the number of ones in B
and the number of elements in mydata
, which is the same. It's like if the indexing has skipped all the zeros in B
. Can anyone explain this?
Example data:
library(raster)
r <- raster(nrow=5, ncol=5, xmn=0, xmx=1, ymn=0, ymx=1)
set.seed(1010)
A <- setValues(r, sample(0:5, ncell(r), replace=TRUE))
B <- setValues(r, sample(0:2, ncell(r), replace=TRUE))
Now you can do:
s <- stack(A,B)
v <- as.data.frame(s)
v[v[,2] == 1, 1]
Alternatively:
A[B==1]
Or:
D <- overlay(A, B, fun=function(x,y){ x[y!=0] <- NA; x})
na.omit(values(D))
Or:
xy <- rasterToPoints(B, function(x) x == 1)
extract(A, xy[,1:2])
Or:
A[B!=1] <- NA
rasterToPoints(A)[, 3]
etc...
Now why does this: A[B[B == 1]]
not work? Unpack it:
B[B == 1]
# [1] 1 1 1 1 1 1 1 1 1 1
The cell values of B
where B==1
are, of course, 1
. A[B[B == 1]]
thus becomes A[c(1,1,1,..)]
, and returns the value of the first cell many times.
A[B]
is equivalent to A[B!=0]
as B
is considered a logical statement in this case, and 0 == FALSE
and all other values are TRUE
this should work for the 1 values:
A[B == 1]
as well as this, for the 0 values
A[B == 0]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With