如何在R terra包中基于多个SpatRaster生成加权均值SpatRaster
解决SpatRaster逐单元格加权均值问题
你遇到的问题是因为terra::weighted.mean的参数结构和app函数传递数据的方式不兼容——app会把每个位置的所有栅格值打包成一个向量传给自定义函数,但weighted.mean需要分别接收x(值向量)和w(权重向量)两个参数,直接指定fun=terra::weighted.mean时,权重参数无法正确传递。
下面提供两种简单可行的解决方案:
方法一:自定义加权均值函数配合app
自己写一个适配app的函数,手动处理权重计算:
# 加载terra包 library(terra) # 构造示例SpatRaster r1 <- rast(nrow=10, ncol=10, vals=rnorm(100)) r2 <- rast(nrow=10, ncol=10, vals=rnorm(100)) r3 <- rast(nrow=10, ncol=10, vals=rnorm(100)) # 定义权重向量 weights <- c(4, 2, 1) weight_sum <- sum(weights) # 自定义加权均值函数 weighted_mean_fun <- function(x) { sum(x * weights) / weight_sum } # 计算加权均值栅格 weighted_mean_raster <- app(c(r1, r2, r3), fun=weighted_mean_fun)
方法二:直接栅格运算(更高效)
因为SpatRaster支持算术运算,直接做线性组合再除以权重总和,这种方法不需要调用app,性能更优:
# 直接计算加权均值 weighted_mean_raster <- (r1*4 + r2*2 + r3*1) / (4+2+1)
如果你的栅格数量较多,也可以用mapply结合权重向量简化代码:
# 栅格列表和权重向量 r_list <- list(r1, r2, r3) weights <- c(4,2,1) # 加权求和后除以权重和 weighted_sum <- sum(mapply(function(r, w) r*w, r_list, weights)) weighted_mean_raster <- weighted_sum / sum(weights)
这两种方法都能精准实现你需要的逐单元格加权均值计算,第二种方法在处理大规模栅格时速度更快。
内容的提问来源于stack exchange,提问作者Yuri
相关产品推荐
相关产品推荐

