我在R中有一个1km分辨率的光栅,其中包含广泛的NA值,但是在不规则的位置(即具有数据的单元不是连续的并且具有遍及的NA值)。我试图聚合这个栅格(使用{raster}包中的aggregate()命令),例如,5km分辨率(因子= 5),用户定义的函数用于平均圆角(包含在下面)。截至目前,除非栅格具有连续的5x5单元区域,否则我无法想象如何获得aggregate()(或我的函数,如果这是问题)来提供结果值。换句话说,如果聚合窗口只有5个单元格区域,而且只有5个单元格具有数据值(20个NA单元格),我仍然希望它返回这两个单元格的平均值。我已经尝试修改函数和aggregate()命令的na.action选项,没有运气。我对功能没有超强的经验,所以问题可能在那里。
很抱歉没有工作示例,但不确定如何在R中生成类似的示例栅格图层。
这是我的循环平均函数:
library(circular)
avg.ang <- function(x,...){
mean.circular(circular(x, units="degrees", rotation="clock", zero=pi/2, modulo="2pi"))
}
这是我正在使用的聚合代码(其中'angle'是一个1km的栅格,其中NA值分散在各处):
library(raster)
angle5k <- aggregate(angle, fact=5, fun=avg.ang, expand=T)
但是这会返回一个栅格图层,其值仅在聚合位置,其中5x5窗口的每个单元格都包含一个值。
答案 0 :(得分:2)
感谢Josh的指导。这是修改后的函数,它可以生成我正在寻找的内容:
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))
}
}
na.rm=TRUE
是关键。 if / else语句用于处理所有单元格= NA的出现(否则会出错)。如果有人有一个更优雅的方式来处理if / else,我会全力以赴。