2011-06-20 8 views
3

RNetCDFを使用してNetCDFデータファイルからデータを抽出するのに問題があります。データファイルは3次元(経度、緯度、日付)と3変数(緯度、経度、気候変数)を持っています。気候変数が異なる4つのデータセットがあります。RNetCDFのRの結果が一貫しません - なぜですか?

ここでは、わかりやすくするために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関数を使用するとわかりません。例えば

、iが最大温度データ(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が(この場合は1285に等しい)time_vec == 200201に設定されています。 エラー:無効な引数

しかし、 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)) 

コマンド:

> 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ファイルで発生しますが、36ではなく82時:

> 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)) 

作品です。

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

上記の特定の例では、lon_valとlat_valはそれぞれ1595と1751で、私が興味を持っている緯度と経度の緯度と経度に沿ったデータセット内の位置を示しています。1595番目の緯度と1751番目の経度はしかし、問題ではない。この問題は私が試した他のすべての緯度と経度で発生します。

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

この問題は必ずしも発生しません。同じコードを3回連続して実行することができます(実行間のすべてのオブジェクトをクリア)、毎回異なる結果を得ることができます。最初の試合は、私が得ようとしている7番目のエントリーを詰まらせ、2番手はうまく動作し、3番目の試合は83番目のエントリーで窒息するかもしれない。私はそのような矛盾した振る舞いに絶対に困惑しています。

open.nc関数も、同じError:Invalid引数で失敗し始めました。 var.get.ncの問題と同様に、一貫性のない問題も発生します。

誰かが最初に変数の抽出に失敗した原因を知っていますか?どうすればそれを防ぐことができますか?データファイルのサイズ(それぞれ〜60GB)やネットワークドライブを介してアクセスしていることが関係していますか?

は、これはまたここに頼まれた: 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 
+0

lon_val、lat_val、stvalの値は何ですか? p8m.tmaxはopen.ncからのnc変数ですか? sessionInfo()はあなたに何を伝えますか?ファイルへのリンク、または類似のリンクと使用している完全なコードを共有できますか? – mdsumner

+0

@mdsumner p8m.tmaxはtmaxデータセットへの接続をどのように割り当てたかです。 p8m.tmax < - open.nc( 'tmax.nc')と同様です。上の特定の例では、lon_valとlat_valはそれぞれ1595と1751で、私が興味を持っている緯度と経度のデータセット内の位置を示しています。stvalは、この場合は1285に等しい(time_vec == 200201)同じ問題(Error:Invalid argument)は、実際の数値を開始ベクトルに入力するかどうかにかかわらず発生します。 – sarcozona

+0

@mdsumner私はデータを所有していないので、データへのリンクを共有することはできません。同様のものを作成するには、netcdfにはあまり慣れていません。各データファイルも60GBです。サンプルコードは、私の公開Dropboxの 'Stack folder'にあります。http://db.tt/BFn0W5Q – sarcozona

答えて

0

をこの問題を解決するために、私はNCDFパッケージ(1.6.5)にRNetCDFパッケージ(バージョン1.5.2-2)から切り替えます。 2つのパッケージの関数は、同じように名前が付けられ、同じ目的を持っています[open.ncとopen.ncdf、var.get.ncとget.var.ncdf]。 Ncdf関数で置き換えられたRNetCDF関数名とまったく同じコードを使用すると、エラーと予想される結果は得られません。次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データを使って作業している他の人たちに役立つでしょう。

関連する問題