【问题标题】:Aggregate raster in R with NA values使用 NA 值在 R 中聚合栅格
【发布时间】:2014-04-29 15:55:38
【问题描述】:

我在 R 中有一个 1 公里分辨率的栅格,其 NA 值广泛分布,但位置不规则(即具有数据的单元格不连续,NA 值分散在各处)。我正在尝试使用用户定义的用于平均圆角的函数(如下所示)以 5 公里分辨率(因子 = 5)聚合此栅格(使用 {raster} 包中的 aggregate() 命令)。到目前为止,除非栅格具有连续的 5x5 像元区域,否则我无法弄清楚如何让 aggregate() (或我的函数,如果这是问题所在)来提供结果值。换句话说,当聚合窗口命中一个 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 窗口的每个单元格都包含一个值。

【问题讨论】:

  • 您需要(至少)在对mean.circular() 的调用中设置na.rm=TRUE
  • 是的,这就是诀窍,再加上一个小的 if/else 修改来处理所有单元格 = NA 时发生的错误。将在下面发布修改后的功能。谢谢!

标签: r aggregate na r-raster


【解决方案1】:

感谢乔希的指导。这是产生我正在寻找的东西的修改后的函数:

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

【讨论】:

  • 太棒了。在第二行中,您也可以使用 all(is.na(x)) 测试该条件
  • 这很好。这个函数要操作什么样的变量?
  • @Paulo 我在罗盘轴承(因此零、旋转和模数选项)上进行圆角测量(0-360°,因此单位选项),我需要在仅 1 公里的更广泛区域上进行平均光栅的分辨率。该应用程序用于气候变化迁移估计。
猜你喜欢
  • 2021-06-28
  • 2018-11-17
  • 2015-07-04
  • 2021-07-30
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多