5

1961 年から 1970 年までの経度、緯度、および月平均変数 (気温や降水量など) で構成されるデータセットがあります。 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 行で構成されるデータ テーブルです。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) 

したがって、I は現在、経度、緯度、および変数で構成される最初の月 (つまり 1961 年 1 月) のデータ テーブルです。データの例を以下に示します。

        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 グリッドと同じ値になります。

ラスターを見てきましたが、それで何もできないようです。

4

3 に答える 3

1

これを使用して行う方法はplyr::ddply()次のとおりです。おそらく、再グリッド化する頻度によっては、テーブル サイズに対して少し遅くなるでしょう。私はdata.tableでそれを行う方法について考えます。これはより高速であるはずです:

require(plyr)
# make your data frame
I<-data.frame(lat=seq(0.5,1000,0.5),lon=1,tmp=sample(1:100,2000,replace=T))

# make an adjustment grid
k<-expand.grid(c(0,0.25),c(0,0.25),0)

# use plyr:ddply() to expand out each entry into the correponding 4 entries
new_I<-ddply(I,.(lat,lon),function(x)as.list(x)+k)
colnames(new_I)<-c("lat","lon","newlat","newlon","tmp")

head(new_I)

  lat lon newlat newlon tmp
1 0.5   1   0.50   1.00  64
2 0.5   1   0.75   1.00  64
3 0.5   1   0.50   1.25  64
4 0.5   1   0.75   1.25  64
5 1.0   1   1.00   1.00  31
6 1.0   1   1.25   1.00  31

実際に考えてみると、これは時間の観点からはより良い方法です (ただし、これは少しハックであり、将来行う可能性のある追加のデータ処理の制御が少なくなります) が、2m で 6.5 秒かかります >> 8M 行。

# make your data frame
I<-data.frame(lat=seq(0.5,1000000,0.5),lon=1,tmp=sample(1:100,2000000,replace=T))

# make an adjustment vector
v<-rep(0.25,times=2000000)

# make 3 new tables, apply the vector appropriately, and rbind
I_latshift<-I
I_lonshift<-I
I_bothshift<-I

I_latshift$lat<-I_latshift$lat+v
I_lonshift$lon<-I_lonshift$lon+v
I_bothshift$lat<-I_bothshift$lat+v
I_bothshift$lon<-I_bothshift$lon+v

I<-rbind(I,I_bothshift,I_latshift,I_lonshift)

# sort it for neatness
I<-I[with(I, order(lat, lon)), ]


head(I)

         lat  lon tmp
1       0.50 1.00   3
6000001 0.50 1.25   3
4000001 0.75 1.00   3
2000001 0.75 1.25   3
2       1.00 1.00  88
6000002 1.00 1.25  88
于 2014-01-16T05:52:46.947 に答える
1

これは R ソリューションではありませんが、CDO を使用して、Linux/MAC OS 環境のコマンド ラインから netcdf ファイルを非常に簡単に再グリッド化できることを指摘しておきます。あなたの説明から、0.25度の通常のグリッドの場合、最近傍補間を使用したいように聞こえます

cdo remapnn,r1440x720 in.nc out.nc

ただし、1 次または 2 次の保守的な再マッピングを使用することもできます。たとえば、最初の注文の場合:

cdo remapcon,r1440x720 in.nc out.nc

次に、現在行っているのと同じ方法で、再グリッド化されたフィールドを R に読み込むことができます。

于 2018-01-17T13:10:14.267 に答える