2013-04-11 222 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”与“猫”,我想我由于这些文件将按时间顺序列出,所以仍然可以工作。