首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为美国的降水上升写一个循环

为美国的降水上升写一个循环
EN

Stack Overflow用户
提问于 2013-08-16 17:04:57
回答 2查看 458关注 0票数 1

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

代码语言:javascript
运行
复制
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,])
    }
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-16 17:30:59

没有必要做一个混乱的循环来在空间上聚合你的数据。只需在光栅包中使用聚合函数:

代码语言:javascript
运行
复制
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创建光栅,然后可以使用上面的方法进行聚合。奖励包括将投影定义为函数中的参数的选项,因此在结束时会有一个地理引用对象。这一点很重要,因为如果您没有聚合数据,那么您将不得不手工计算出如何对结果矩阵进行地理引用。

编辑:如果你想要一个与原始栅格尺寸相同的光栅,那么在聚合数据后立即将其分解。虽然这似乎是多余的,但这些光栅方法非常快速。

代码语言:javascript
运行
复制
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
票数 3
EN

Stack Overflow用户

发布于 2018-03-31 09:20:34

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

代码语言:javascript
运行
复制
cdo remapcon,grid_specification_here in.nc out.nc 

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18278641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档