我正在编写一个代码来计算美国不同地区的平均降水量。我的总数据有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,])
}
}
}
答案 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
请注意,上面给出的答案是近似值,并且不太正确,因为网格单元格大小与纬度函数不同。由于单元格大小合适,因此该特定任务的错误大小可能很小,但是答案稍有偏差。