我有一个数据集,由 lon、lat 和涵盖 1961 年至 1970 年的月平均变量(例如温度或降水)组成。该数据集的分辨率为 0.5 x 0.5 度经/纬度,覆盖整个地球,并以 .我使用 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)
Run Code Online (Sandbox Code Playgroud)
扩展网格(E)是由31,104,000行变量组成的数据表,扩展网格(D)是由259,200行经/纬度组成的数据表。如果乘以 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)
Run Code Online (Sandbox Code Playgroud)
因此I现在是第一个月(即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 …Run Code Online (Sandbox Code Playgroud) 我有一个使用 Rcpp 的小型 C++ 函数,它用另一个矩阵的值替换一个矩阵的元素。它适用于单个单元格或如下列:
cppFunction('NumericMatrix changeC(NumericMatrix one, NumericMatrix two) {
NumericMatrix a = one;
NumericMatrix b = two;
b(_,1) = a(_,1);
return b;
}')
changeC(g,f)
Run Code Online (Sandbox Code Playgroud)
如果最初 f 是以下矩阵:
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 6 6 6 6 6 6
[2,] 6 6 6 6 6 6
[3,] 6 6 6 6 6 6
[4,] 6 6 6 6 6 6
[5,] 6 6 6 6 6 6
[6,] 6 6 6 6 6 6
Run Code Online (Sandbox Code Playgroud)
和 g 看起来像以下矩阵: …
这可能是一个非常基本的请求,但我在 R 中有一个 Rcpp 函数,它计算我想传回给 R 的各种矩阵。我的代码如下所示:
zeromatrix <- matrix(0,6,1)
east <- matrix(seq(1:48),6,8)
west <- matrix(seq(1:48),6,8)
func <- 'NumericMatrix eastC(NumericMatrix e, NumericMatrix w, NumericMatrix zeromatrix) {
int ecoln=e.ncol();
int ecolnlessone = ecoln - 1;
NumericMatrix eout(e.nrow(),e.ncol()) ;
for (int j = 0;j < ecoln;j++) {
if (j > 0) {
eout(_,j) = e(_,j-1);
} else {
eout(_,j) = e(_,0);
}
}
eout(_,0) = zeromatrix(_,0);
return eout;
NumericMatrix wout(w.nrow(),w.ncol()) ;
for (int j = 0;j < ecoln;j++) {
if (j < …Run Code Online (Sandbox Code Playgroud) 我在将数据从GrADS导出到.csv文件时遇到了真正的困难,尽管它应该非常简单.该文件来自与亚洲降雨有关的APHRODITE项目.基本上我可以使用以下方法将此文件读入GrADS:
open d:/aphro/aphro.ctl
Run Code Online (Sandbox Code Playgroud)
它告诉我:
Data file d:/aphro/APHRO_MA_025deg_V1101R2.%y4 is open as file 1
Lon set to 60.125 149.875
Lat set to -14.875 54.875
Lev set to 1 1
Time values set: 1961:1:1:0 1961:1:1:0
E set to 1 1
Run Code Online (Sandbox Code Playgroud)
如果我执行:
q ctlinfo
Run Code Online (Sandbox Code Playgroud)
它还告诉我,我有三个变量:
precip 1 0 daily precipitation analysis
rstn 1 0 ratio of 0.05 degree grids with station
flag 1 0 ratio of 0.05 degree grids with snow
Run Code Online (Sandbox Code Playgroud)
好的,现在我想做的就是在.csv文件(或.txt)文件中生成一个列表,其中包含以下信息:
Precipitation Lon Lat Time(date)
Run Code Online (Sandbox Code Playgroud)
这听起来很容易,但我无法做到.一种方法是使用:
fprintf precip d:/output.csv %g 1
Run Code Online (Sandbox Code Playgroud)
这给了我一个.csv文件,其中包含当天在一个长列中的整个数据(这就是我想要的).我也可以为lon和lat在不同的文件中做同样的事情并将它们组合起来.问题是输出文件需要很长时间 - …