2011-06-20 61 views
3

我無法使用RNetCDF從NetCDF數據文件中提取數據。每個數據文件都有3個維度(經度,緯度和日期)和3個變量(緯度,經度和氣候變量)。有四個數據集,每個數據集都有不同的氣候變量。R與RNetCDF的結果不一致 - 爲什麼?

爲了清楚起見,以下是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函數。

例如,當我試圖提取82個值在stval從最高溫度數據開始(p8m.tmax < - open.nc(tmaxdataset.nc)),與

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

(其中lon_val和lat_val指定數據集中我感興趣的座標和stval的位置stval設置爲哪個(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文件會發生同樣的問題,但在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)) 

的作品。

這些例子看起來好像函數在最後一次計數失敗,但事實並非如此。在第一個示例中,我詢問了84個值後,var.get.nc給出了Error:無效參數。然後,我通過改變數據集中的起始點並一次只請求1個值,將故障範圍縮小到第82位。問題發生的具體編號也各不相同。我可以關閉並重新打開數據集,並在不同的位置出現問題。

在上面的特定例子中,lon_val和lat_val分別是1595和1751,標識了我感興趣的緯度和經度沿緯度和經度的數據集中的位置。第1595緯度和第1751經度是但不是問題。我嘗試過的所有其他經緯度都會出現問題。

根據氣候變量維度(stval)和/或指定它不同(作爲命令中的數字而不是對象stval)來改變數據集中的起始位置也不能解決問題。

此問題並不總是會發生。我可以連續運行三次相同的代碼(清除運行之間的所有對象),並且每次都得到不同的結果。第一場比賽可能會在我試圖獲得的第7場比賽中窒息,第二場比賽可能會正常工作,第三場比賽可能會在第83場比賽中窒息。我對這種不一致的行爲感到莫名其妙。

open.nc函數也開始失敗,出現相同的錯誤:無效參數。像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被設置爲(time_vec == 200201),在這種情況下等於1285 。同樣的問題(錯誤:無效的參數)會發生,無論我是否將實際數字輸入到起始向量中。 – sarcozona

+0

@mdsumner我不能共享數據的鏈接,因爲我不擁有這些數據,而且我對netcdf也不熟悉以創建類似的數據。每個數據文件也是60GB。示例代碼位於我的公共保管箱中的'Stack文件夾'中http://db.tt/BFn0W5Q – sarcozona

回答

0

爲了解決這個問題,我從RNetCDF包(1.5.2-2版)切換到ncdf包(1.6.5)。這兩個包中的函數具有相似的名稱並具有相同的用途[open.nc vs open.ncdf,var.get.nc vs. 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數據的其他人。