2013-04-11 64 views
0

我是一個新的R用戶。我現在有1979年的每日netcdf數據如下:
sm19790101.1.nc
sm19790102.1.nc



sm19791231.1.nc批量讀取netcdf文件和平均一個變量

我需要將一個名爲「sm」的變量平均爲每月分辨率。我現在可以這樣做:

glob2rx("sm197901*.1.nc") 
jan<-list.files(pattern=glob2rx("sm197901*.1.nc"),full.names=TRUE) 

到端口的所有月份數據揚,但我不知道如何打開每個文件並獲得特定的變量(我已經安裝了Rnetcdf包)。如果我是手動做到這一點,它應該是:

s19790101<-open.nc("sm19790101.1.nc") 
sm19790101<-var.get.nc(s19790101,"sm",na.mode=0) 

,然後取它們的平均值...

我想這個問題是如何與一個可變的讀取文件(例如01-31)的一部分的文件名,然後循環整個月。

+0

對不起。你用「批處理文件」標籤標記了這個問題。你想要一個Windows-DOS批處理.bat文件解決方案嗎?如果是,請張貼日常文件的格式(內容)並指明「sm」變量在其中的位置。如果沒有,請從您的問題中刪除「批處理文件」標記。 – Aacini 2013-04-12 01:56:59

回答

0

它看起來像你可以粘貼文件名組件「sm197901」,天,「.1.nc」構造所需的文件名。

#make sure it has a leading 0 
days = formatC(1:31, width=2, flag="0") 
ncfiles = lapply(days, function(d){ 
    filename = paste("sm197901", d, ".1.nc", sep="") 
    #print(filename) 
    open.nc(filename) 
}) 
+0

感謝Kith的及時幫助!所以在腳本的最後部分,我應該如何將open.nc()作爲文件名? – EDU 2013-04-11 21:28:35

+0

filename是一個包含構造文件名的變量。當你調用open.nc(filename)時,你將構造的名字傳遞給函數。取消註釋打印(文件名)行,它將打印出構造的文件名。 – kith 2013-04-11 21:33:32

+0

對,然後我想從列表中獲取變量,如:'var.get.nc(ncfiles,「sm」,na.mode = 0)'但是它說類(ncfile)==「NetCDF」不是TRUE 。看起來ncfiles是我們剛剛構建的文件列表,不能直接訪問nc文件操作符。 – EDU 2013-04-11 22:26:48

0

平行於Dave的NCRA回答你也可以做到每月手段CDO

cdo mergetime sm1979????.1.nc year.nc 
# you only need this next step if there is more than one variable in the file: 
cdo selvar,sm year.nc yearsm.nc 
cdo monmean year.nc month.nc 

在某些系統中打開的文件數限制爲256 - 如果這是你的情況,你可以替換「mergetime」與「貓」,我想我由於這些文件將按時間順序列出,所以仍然可以工作。