1

我正在编写一个代码来计算美国本土不同地区的平均降水量。我的总数据有 300 乘以 120 (lon*lat) Netcdf 格式的网格。我想在 R 中编写一个循环来取每 10 x 10 个网格的平均值,并将该值(平均值)分配给区域内的所有网格,并为下一个区域重复此操作。最后,我将拥有 12 x 30 的网格,而不是 120 x 300 的网格。所以这是一种我想应用于我的数据的升级方法。我可以为每个区域分别使用一个 for 循环,但这使我的代码非常庞大,我不想这样做。任何想法将不胜感激。谢谢。PS:这是我为一个区域 (10by10) lat*lon 编写的函数。

upscaling <- function(file, variable, start.time=1, count.time=1)
{
  library(ncdf)   # load ncdf library to manipulate ncdf data
  ncdata <- open.ncdf(file);      # open ncdf file
  lon  <- get.var.ncdf(ncdata, "lon");
  lat  <- get.var.ncdf(ncdata, "lat");
  time <- get.var.ncdf(ncdata, "time");
  start.lon <- 1
  end.lon   <- length(lon)
  start.lat <- 1
  end.lat   <- length(lat)
  count.lon <- end.lon - start.lon + 1;   # count number of longitude
  count.lat <- end.lat - start.lat + 1;   # count number of latitude
  dat <- get.var.ncdf(ncdata, variable, start=c(start.lon, start.lat, 1),               
                      count=c(count.lon, count.lat, 1))
  temp.data<- array(0,dim=c(10,10))
  for (i in 1:10)
  {
    for (j in 1:10)
    {
      temp.data <- mean(dat[i,j,])
    }
  }
}
4

2 回答 2

3

无需进行混乱的循环来在空间上聚合您的数据。只需使用 raster 包中的聚合函数:

library(raster)
a=matrix(data=c(1:100),nrow=10,ncol=10)
a=raster(a)
ra  <-  aggregate(a,  fact=5,  fun=mean) #fact=5 will aggregate using a 5x5 window
ra=as.matrix(ra)
ra

现在对于您的 netcdf 数据,使用栅格的 rasterFromXYZ 创建可以使用上述方法聚合的栅格。奖励包括将投影定义为函数中的参数的选项,因此您最终会得到一个地理参考对象。这很重要,因为如果您在没有它的情况下聚合您的数据,那么您将不得不手动弄清楚如何对生成的矩阵进行地理配准。

编辑:如果您想要一个与原始栅格具有相同尺寸的结果栅格,请在聚合后立即分解数据。虽然这似乎是多余的,但这些栅格方法非常快。

library(raster)
a=matrix(data=c(1:100),nrow=10,ncol=10)
a=raster(a)
ra  <-  aggregate(a,  fact=5,  fun=mean) #fact=5 will aggregate using a 5x5 window
ra  <-  disaggregate(ra, fact=5)
ra=as.matrix(ra)
ra
于 2013-08-16T17:30:59.107 回答
0

如果您的网格定义遵循标准 netcdf 约定,那么您可能能够使用 CDO 重新映射函数进行重新映射。对于一阶保守重映射,您可以尝试

cdo remapcon,grid_specification_here in.nc out.nc 

请注意,上面给出的答案是近似的,并不完全正确,因为网格单元大小与纬度的函数不同。对于这个特定的任务,错误的大小可能很小,因为单元格大小很好,但答案会稍微偏离。

于 2018-03-31T09:20:34.987 回答