Всегда включайте пример данных, пожалуйста
library(raster)
fn <-system.file("external/rlogo.grd", package="raster")
s <- stack(fn)
s[[1]][1:5000] <- NA
s[[2]][5001:ncell(s)] <- NA
names(s)
#[1] "red" "green" "blue"
p <- rbind(c(5,20), c(25,55), c(50, 20), c(20,6), c(5,20))
pol <- spPolygons(p)
plot(s, addfun=function() lines(pol, lwd=2))
Я не совсем уверен, что вы ищете.Количество ячеек (пикселей) будет одинаковым для всех растров, если вы можете сложить их (что, как вы говорите, вы можете).Я предполагаю, что вы хотите сумму ячеек, которые не NA
.Если у вас на самом деле есть растры с другим происхождением / разрешением, вы можете повторить эти шаги, но нет необходимости укладывать их в RasterStack
, но вам нужно будет изменить подход, чтобы также подсчитать ячейки NA
.
Простой подход для небольших объектов:
m <- mask(s, pol)
cellStats(m, function(i, ...) sum(!is.na(i)))
# red green blue
# 600 506 1106
Если для этого не хватает памяти, вы можете сделать:
m <- mask(s, pol)
x <- reclassify(m, cbind(-Inf, Inf, 1))
names(x) <- names(m)
cellStats(x, 'sum')
#red green blue
#600 506 1106
Вы также можете попробовать:
extract(s, pol, fun=function(x,...)length(na.omit(x)))
# red green blue
#[1,] 600 506 1106
Если вы хотите сосчитать все ячейки (NA
или нет), вы можете сделать что-то вроде
# example RasterLayer
r <- s[[1]]
# this step may help in speed if your polygon is small relative to the raster
r <- crop(r, pol)
x <- rasterize(pol, r, 1)
cellStats(x, 'sum')
#[1] 1106