3

RNetCDF を使用して NetCDF データ ファイルからデータを抽出する際に問題があります。各データ ファイルには、3 つのディメンション (経度、緯度、日付) と 3 つの変数 (緯度、経度、気候変数) があります。4 つのデータセットがあり、それぞれに異なる気候変数があります。

わかりやすくするために、print.nc(p8m.tmax) からの出力の一部を次に示します。他のデータセットは、特定の気候変数を除いて同一です。

dimensions:
  month = UNLIMITED ; // (1368 currently)
  lat = 3105 ;
  lon = 7025 ;
variables:
  float lat(lat) ;
          lat:long_name = "latitude" ;
          lat:standard_name = "latitude" ;
          lat:units = "degrees_north" ;
  float lon(lon) ;
          lon:long_name = "longitude" ;
          lon:standard_name = "longitude" ;
          lon:units = "degrees_east" ;
  short tmax(lon, lat, month) ;
          tmax:missing_value = -9999 ;
          tmax:_FillValue = -9999 ;
          tmax:units = "degree_celsius" ;
          tmax:scale_factor = 0.01 ;
          tmax:valid_min = -5000 ;
          tmax:valid_max = 6000 ;

RNetCDF パッケージの var.get.nc 関数を使用すると、理解できない動作が発生します。

たとえば、最大温度データ (p8m.tmax <- open.nc(tmaxdataset.nc)) から stval で始まる 82 個の値を抽出しようとすると、

 > var.get.nc(p8m.tmax,'tmax', start=c(lon_val, lat_val, stval),count=c(1,1,82))

(ここで、lon_val と lat_val は、関心のある座標のデータセット内の位置を指定し、stval は stval が which(time_vec==200201) に設定され、この場合は 1285 に設定されます。) エラーが発生します: 引数が無効です。

しかし、80 と 81 の値を正常に抽出した後

> var.get.nc(p8m.tmax,'tmax', start=c(lon_val, lat_val, stval),count=c(1,1,80))
> var.get.nc(p8m.tmax,'tmax', start=c(lon_val, lat_val, stval),count=c(1,1,81))

82 のコマンドは次のように機能します。

> var.get.nc(p8m.tmax,'tmax', start=c(lon_val, lat_val, stval),count=c(1,1,82))

[1]  444  866 1063 ... [output snipped]

同じ構造の tmin ファイルでも同じ問題が発生しますが、82 ではなく 36 で発生します。

> var.get.nc(p8m.tmin,'tmin', start=c(lon_val, lat_val, stval),count=c(1,1,36))

エラーを生成: 引数が無効です

しかし、30、31などのカウントで繰り返した後

> var.get.nc(p8m.tmin,'tmin', start=c(lon_val, lat_val, stval), count=c(1,1,36)) 

動作します。

これらの例では、最後のカウントで関数が失敗しているように見えますが、実際にはそうではありません。最初の例では、84 個の値を要求した後、var.get.nc が Error: Invalid argument を返しました。次に、データセットの開始点を変更し、一度に 1 つの値のみを要求することで、失敗を 82 番目のカウントに絞り込みました。問題が発生する特定の番号も異なります。データセットを閉じて再度開くと、別の場所で問題が発生します。

上記の特定の例では、lon_val と lat_val はそれぞれ 1595 と 1751 であり、関心のある緯度と経度の緯度と経度のディメンションに沿ってデータセット内の位置を識別します。1595 番目の緯度と 1751 番目の経度は問題ではありません。でも。この問題は、私が試した他のすべての緯度と経度で発生します。

気候変数の次元 (stval) に沿ってデータセット内の開始位置を変更したり、(オブジェクト stval の代わりにコマンドで数値として) 別の場所を指定したりしても、問題は解決しません。

この問題は常に発生するわけではありません。同じコードを 3 回続けて実行し (実行の間にすべてのオブジェクトをクリアする)、毎回異なる結果を得ることができます。最初の実行は取得しようとしている 7 番目のエントリで停止する可能性があり、2 回目は正常に動作し、3 回目の実行は 83 番目のエントリで停止する可能性があります。私はそのような一貫性のない行動に完全に困惑しています。

open.nc 関数も同じエラーで失敗し始めました: 引数が無効です。var.get.nc の問題と同様に、これも矛盾して発生します。

変数を抽出する際の最初の失敗の原因を知っている人はいますか? そして、どうすればそれを防ぐことができますか?データ ファイルのサイズ (それぞれ最大 60 GB) および/またはネットワーク ドライブ経由でデータ ファイルにアクセスしているという事実に関係している可能性はありますか?

これはここでも尋ねられました: https://stat.ethz.ch/pipermail/r-help/2011-June/281233.html

> sessionInfo()
R version 2.13.0 (2011-04-13)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] reshape_0.8.4   plyr_1.5.2      RNetCDF_1.5.2-2

loaded via a namespace (and not attached):
[1] tools_2.13.0
4

1 に答える 1

0

この問題を解決するために、RNetCDF パッケージ (バージョン 1.5.2-2) から ncdf パッケージ (1.6.5) に切り替えました。2 つのパッケージの関数は似たような名前で、同じ目的を持っています [open.nc と open.ncdf、var.get.nc と get.var.ncdf]。RNetCDF 関数名を ncdf 関数に置き換えたまったく同じコードを使用すると、エラーは発生せず、期待どおりの結果が得られます。

そのため、次の RNetCDF コマンドは失敗します (明確な理由がない場合のみ)。

>p8m.tmax <- open.nc('tmax.nc')
>var.get.nc(p8m.tmax,'tmax', start=c(lon_val, lat_val, stval),count=c(1,1,82))

これらの ncdf コマンドは決して失敗しません

>p8m.tmax <- open.ncdf('tmax.nc')
>get.var.ncdf(p8m.tmax,'tmax', start=c(lon_val, lat_val, stval),count=c(1,1,82))

これは本当の解決策ではありません。RNetCDF パッケージの関数が機能する場合と機能しない場合がある理由はまだわかりません。ただし、必要なデータを抽出することはできます。R で netcdf データを操作する他のユーザーに役立つことを願っています。

于 2011-06-22T23:57:36.957 に答える