我正在编写一个代码来计算美国不同地区的平均降水量。我的总数据具有Netcdf格式的300乘以120 (lon*lat)网格。我想用R写一个循环,取每10个网格的平均数,并将这个值(平均值)分配给区域内的所有网格,并在下一个区域重复这个值。最后,不是120×300个网格,而是12×30个网格。所以这是一种升级方法,我想应用到我的数据中。我可以单独对每个区域使用for -循环,但是它使我的代码非常庞大,我不想这样做。任何想法都将不胜感激。谢谢。这是我为一个地区(10乘10) 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,])
}
}
}
发布于 2013-08-16 09:30:59
没有必要做一个混乱的循环来在空间上聚合你的数据。只需在光栅包中使用聚合函数:
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
发布于 2018-03-31 01:20:34
如果网格定义遵循标准netcdf约定,则可以使用CDO重新映射函数重新映射。对于一阶保守重映射,您可以尝试
cdo remapcon,grid_specification_here in.nc out.nc
请注意,上面给出的答案是近似的,而且不完全正确,因为网格单元格大小与纬度的函数不相同。对于这个特定的任务,错误的大小可能很小,因为单元格大小很好,但是答案会稍微差一些。
https://stackoverflow.com/questions/18278641
复制