我有一个1米分辨率的二进制光栅(r),我想将它转换为4m分辨率的百分比值。这个新的光栅将每个像素值代表百分比,根据16个像素中的1个的总频率计算我看着有raster
功能的aggregate
包。但是,这不起作用。
newras <-aggregate(r, fact=4, fun= percent)
你做的不起作用,因为没有名为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)
这是一种仅使用矩阵的方法。我使用的是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]