我有一个由lon,lat和月平均变量(例如温度或降水)组成的数据集,涵盖1961年至1970年 . 数据集的分辨率为0.5 x 0.5度lon / lat,覆盖全球并作为a . 下载 . 我使用以下方法在R中提取数据的NC文件:
library(ncdf)
f <- open.ncdf("D:/CRU/cru_ts3.21.1961.1970.tmp.dat.nc")
A <- get.var.ncdf(nc=f,varid="tmp")
B <- get.var.ncdf(nc=f,varid="lon")
C <- get.var.ncdf(nc=f,varid="lat")
D <- cbind(expand.grid(B, C))
E <- expand.grid(A)
扩展网格(E)是由31,104,000行变量组成的数据表,扩展网格(D)是由259,200行lon / lat组成的数据表 . 如果你乘以259,200 * 10年* 12个月就得到31,104,000 . 因此,表E可以通过使用以下方式切割为月度值:
Month <- 1
Start <- (Month-1)*(259200)+1
Finish <- (Month*259200)
G <- E[Start:Finish,]
H <- expand.grid(G)
I <- cbind(D,H)
因此,我现在是第一个月(即1961年1月)的数据表,包括lon,lat和变量 . 下面给出了一个数据示例:
lon lat tmp
49184 -68.25 -55.75 7.5
49185 -67.75 -55.75 7.6
49186 -67.25 -55.75 7.6
49899 -70.75 -55.25 6.8
49900 -70.25 -55.25 7.0
49901 -69.75 -55.25 6.9
49902 -69.25 -55.25 7.1
49903 -68.75 -55.25 6.8
49904 -68.25 -55.25 7.6
49905 -67.75 -55.25 8.2
现在我的问题 . 网格的当前分辨率为0.5 * 0.5度,我想“重新”数据,因此分辨率为0.25 * 0.25度 . 我不想做任何特别聪明的数据,所以我只想让0.25网格取其所在的0.5网格的值,即每个0.5 * 0.5网格包含4个0.25 * 0.25网格,我只想要4个0.25 * 0.25网格与0.5 * 0.5网格具有相同的值 .
我看过光栅,但似乎无法用它做任何事情 .
3 回答
这是一种使用
plyr::ddply()
的方法 - 可能它对于您的表大小来说有点慢,这取决于您想要重新网格化的频率 . 我将考虑使用data.table来实现它的方法,它应该更快:实际上考虑一下,从时间的角度来看,这是一个更好的方法(尽管它有点像黑客,并且让你对未来可能希望做的额外数据处理的控制较少),但是2m需要6.5秒>> 8M行 .
R包中存在一个解决方案
raster
. 它如下我希望这能达到目的 .
这不是R解决方案,只是要指出您可以使用CDO从linux / MAC OS环境中的命令行非常容易地重新编译netcdf文件 . 根据您的描述,听起来好像您想要使用最近邻插值,这对于0.25度的常规网格来说就是如此
但是,您也可以使用一阶或二阶保守重映射 . 例如,对于第一个订单:
然后,您可以按照与当前相同的方式将重新划分的字段读入R中 .