首页 > 解决方案 > 使用 zonal 命令进行加权平均计算

问题描述

我想知道每个类别的变量加权平均值(因为每个像素都有一个权重)。下面的代码不允许我做加权平均。任何建议将不胜感激!

#sample rasters
    r <- raster(ncols=10, nrows=10)
    category <-  raster(ncols=10, nrows=10)
    weight <-  raster(ncols=10, nrows=10)
    r[] <- runif(ncell(r)) * 1:ncell(r)
    category[] <- runif(ncell(category)) * 1:ncell(category)
    weight[] <- 1:ncell(weight)

#mean for each category
    zonalstats <- zonal(r, z=category, fun='mean', digits=0, na.rm=TRUE, count=T)

标签: rraster

解决方案


你可以使用这个功能。它适用zonal于权重和栅格值,并计算加权平均值。

weightedZonalMean <- function(r, z, w, na.rm = TRUE, ...){
  zonalvalues <- zonal(r, z=z, fun=function(x, na.rm){x}, na.rm, ...)
  zonalweights <- zonal(w, z=z, function(x, na.rm){x},  na.rm, ...)
  weigtedValues <- cbind(zonalvalues[,1], 
                         sapply(1:nrow(zonalvalues), function(x){
    stats::weighted.mean(x = zonalvalues[x, 2:ncol(zonalvalues)], 
                         w = zonalweights[x, 2:ncol(zonalweights)])
  }))  
  return(weigtedValues)
}
weightedZonalMean(r, z, w, digits = 0)
#       [,1]      [,2]
#  [1,]    0 12.254438
#  [2,]    1  0.487548
#  [3,]    2  1.246249
#  [4,]    3 17.283858
#  [5,]    4 22.545906
#  [6,]    5 29.388179
#  [7,]    6 13.494853
#  [8,]    8  1.592464
#  [9,]    9 15.510155
# [10,]   10 10.091313
# ...

推荐阅读