在R中聚合具有NA值的栅格

时间:2014-04-29 15:55:38

标签: r aggregate na r-raster

我在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窗口的每个单元格都包含一个值。

1 个答案:

答案 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,我会全力以赴。