如何将二进制栅格聚合为R中的百分比

问题描述 投票:2回答:2

我有一个1米分辨率的二进制光栅(r),我想将它转换为4m分辨率的百分比值。这个新的光栅将每个像素值代表百分比,根据16个像素中的1个的总频率计算我看着有raster功能的aggregate包。但是,这不起作用。

   newras <-aggregate(r, fact=4,  fun= percent)
r matrix gis raster r-raster
2个回答
4
投票

你做的不起作用,因为没有名为percentage的功能。但你可以做一个。在这种情况下,平均值是分数,因此您将其乘以100以获得百分比。

示例数据

library(raster)
r <- raster()
set.seed(0)
values(r) <- sample(0:1, ncell(r), replace=TRUE)

骨料

a <- aggregate(r, 4, fun=function(x,...) 100 * mean(x))   
# or 
a <- 100 * aggregate(r, 4, mean)

考虑NA

r[sample(ncell(r), 0.9 * ncell(r))] <- NA

# Make a function and use it    
percentage <- function(x, ...) { x <- na.omit(x); 100 * mean(x) }
a <- aggregate(r, 4, fun=percentage)

# or do
a <- 100 * aggregate(r, 4, fun=mean, na.rm=TRUE)

1
投票

这是一种仅使用矩阵的方法。我使用的是40 x 40矩阵。如果尺寸不是4的倍数,则需要考虑该方法。

原始矩阵:

mtx <- matrix(sample(0:1, 40^2, TRUE), 40, 40)

用作分组参数的索引:

inds <- Map(seq, seq(1, 37, 4), seq(4, 40, 4))

分成4乘4块。 blockarray有16行(组内的每个元素)和100列(代表组)。请注意,40 x 40 = 16 x 100。

blockarray <- mapply(function(i, j) mtx[i, j],
                     rep(inds, times = 10),
                     rep(inds, each = 10))

要获得百分比矩阵:

pcts <- matrix(colMeans(blockarray)*100, 10, 10)

目视检查结果:

image(mtx, zlim = 0:1, col = c("white", "black"))
image(pcts, zlim = c(0, 100), col = colorRampPalette(c("white", "black"))(11))

验证结果:

sum(mtx[1:4, 5:8])/16*100
pcts[1, 2]
© www.soinside.com 2019 - 2024. All rights reserved.