我在 R 中有一个分辨率为 1 公里的栅格,其 NA 值分布广泛,但位置不规则(即,包含数据的单元格不连续,并且 NA 值分散)。我正在尝试使用用户定义的平均圆角函数(包括在下面)以 5 公里分辨率(因子 = 5)聚合此栅格(使用 {raster} 包中的aggregate() 命令)。截至目前,我无法弄清楚如何让aggregate()(或我的函数,如果这是问题的话)提供结果值,除非栅格具有连续的 5x5 像元区域。换句话说,当聚合窗口命中 5x5 单元格区域时,仅包含 5 个具有数据值的单元格(20 个 NA 单元格),我仍然希望它返回这 2 个单元格的平均值。我尝试修改函数和aggregate()命令的na.action选项,但没有成功。我对功能不是很有经验,所以问题可能就在那里。
抱歉没有工作示例,但不确定如何在 R 中生成类似的示例栅格图层。
这是我的循环平均函数:
library(circular)
avg.ang <- function(x,...){
mean.circular(circular(x, units="degrees", rotation="clock", zero=pi/2, modulo="2pi"))
}
这是我正在使用的聚合代码(其中“角度”是 1 公里栅格,NA 值分散在各处):
library(raster)
angle5k <- aggregate(angle, fact=5, fun=avg.ang, expand=T)
但这会返回一个仅在聚合位置处具有值的栅格图层,其中 5x5 窗口的每个像元都包含一个值。
感谢乔什的指导。这是生成我正在寻找的内容的修改后的函数:
avg.ang <- function(x, ...){
if (sum(is.na(x))==length(x)) {
NA
} else {
round(mean.circular(circular(x, units="degrees", rotation="clock",
zero=pi/2, modulo="2pi"), na.rm=TRUE))
}
}
The na.rm=TRUE
是关键。 if/else 语句用于处理所有单元格=NA 的情况(否则会出现错误)。如果有人有更优雅的方式来处理 if/else,我洗耳恭听。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)