'Counting pixels of same value in R
I need help with counting pixels of the same value in R. I'm doing a master thesis and part of it is calculating the NDWI of an area before and after floods so I can calculate the surface under water. From the results of NDWI after the flood values that are above 0 are under water and those under 0 are not. So I'm kinda stuck here bcs I can't figure out how to calculate all pixels above value 0.
Solution 1:[1]
Using your dropbox data:
library(terra)
ndwi <- rast('Clip_ndwi_poslije1.tif')
ndwi_vec <- values(ndwi, mat = FALSE)
> length(which(ndwi_vec > 0))
[1] 21157
> length(which(ndwi_vec <= 0))
[1] 13217
> dim(ndwi)[1]
[1] 220
> dim(ndwi)[1]*dim(ndwi)[2]
[1] 58300
> sum(length(which(ndwi_vec > 0)), length(which(ndwi_vec <= 0)))
[1] 34374
> table(is.na(ndwi[])) # see below
FALSE TRUE
34374 23926
Table approach is from SOF-GIS ?s, and get you started.
Solution 2:[2]
Your data
library(terra)
r <- rast("Clip_ndwi_poslije1.tif")
You could count the cells with values that are larger than zero (or not) like this:
freq(r > 0)
# layer value count
#[1,] 1 0 13217
#[2,] 1 1 21157
TRUE == 1, so you have 21,157 cells with a value larger than zero.
But to accurately compute the area covered by these cells, you need to first get the area of each cell:
a <- cellSize(r)
And then sum these areas
b <- ifel(r > 0, a, NA)
# or the equivalent
# b <- mask(a, r>0, maskvalue=0)
global(b, "sum", na.rm=TRUE)
# sum
#ndwiii 19013036
In this case, that is similar to (incorrectly) assuming that the nominal spatial resolution is valid for each grid cell.
global(r > 0, "sum", na.rm=TRUE) * prod(res(r))
# sum
#ndwiii 19041300
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Robert Hijmans |
