写一个循环来扩大美国的降水量

时间:2013-08-16 17:04:57

标签: r netcdf

我正在编写一个代码来计算美国不同地区的平均降水量。我的总数据有Netcdf格式的300次120(lon * lat)网格。我想在R中写一个循环来取每个10乘以10个网格的平均值,并将该值(平均值)分配给该区域内的所有网格,并对下一个区域重复此操作。最后,我将有12到30个网格而不是120到300个网格。所以这是一种我希望应用于我的数据的升级方法。我可以单独为每个区域使用for循环,但它使我的代码非常庞大,我不想这样做。任何想法将不胜感激。谢谢。 P.S:这是我为一个区域(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,])
    }
  }
}

2 个答案:

答案 0 :(得分:3)

没有必要制作一个混乱的循环来空间聚合您的数据。只需使用栅格包中的聚合函数:

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创建可以使用上述方法聚合的栅格。 Bonus包括将投影定义为函数中的参数的选项,因此您最终会得到一个地理参考对象。这很重要,因为如果你在没有数据的情况下汇总数据,那么你必须手工弄清楚如何对结果矩阵进行地理配准。

编辑:如果您希望生成的栅格与原始栅格具有相同的尺寸,请在聚合后立即对数据进行分解。虽然这似乎是多余的,但这些栅格方法非常快。

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

答案 1 :(得分:0)

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

cdo remapcon,grid_specification_here in.nc out.nc 

请注意,上面给出的答案是近似值,并且不太正确,因为网格单元格大小与纬度函数不同。由于单元格大小合适,因此该特定任务的错误大小可能很小,但是答案稍有偏差。