常用函数:
nc_open 打开.nc文档
nc_close 关闭.nc文档
nc_create 新建.nc文档
ncvar_get 读取变量数据
ncatt_get 读取变量属性
ncvar_def 设定变量
ncdim_def 设定维度
ncvar_add 添加变量
ncvar_put 写入变量数据
ncatt_put 写入变量属性
一、读取.nc格式数据
1、nc_open的用法:
nc_open( filename, write=FALSE, readunlim=TRUE, verbose=FALSE, auto_GMT=TRUE, suppress_dimvals=FALSE )
nc_open用于打开已存在的.nc文档。在仅对数据进行读取操作的情况下,我们只需输入路径参数filename,其他参数保持默认值即可。(如果数据很大,为了减少运行时间也可将readunlim设置为FALSE)
2、ncatt_get的用法
ncatt_get( nc, varid, attname=NA, verbose=FALSE )
ncatt_get用于查看所选变量的属性。其中,参数nc是即将进行读取操作的数据集,其数据类型需是ncdf4型(即用nc_open或nc_create函数生成的数据);参数varid是要读取的变量名,其数据类型需是character型;参数attname是要读取的属性名,其数据类型需是character型;参数verbose决定是否输出debug信息,一般保持默认值即可。
3、ncvar_get的用法
ncvar_get(nc, varid=NA, start=NA, count=NA, verbose=FALSE, signedbyte=TRUE, collapse_degen=TRUE)
ncvar_get用于提取所选变量的数据。其中,参数nc是即将进行读取操作的.nc数据集,其数据类型需是ncdf4型;参数varid是要读取的变量名,其数据类型需是character型;参数start是读取的起始位置;参数count是数据读取的总个数;一般情况下,剩余3个参数保持默认值就可以。
4、nc_close的用法
nc_close( nc )
在读完或者写完,特别是写完一个.nc文档之后,一定记得关闭它。
示例代码如下:
-
library(ncdf4) #加载ncdf4包
-
setwd('E:\\')#设置工作目录
-
nc<-nc_open('E:\\GOSIF_GPP_2001.M01_Mean.nc') #打开.NC文档,并将其赋值给nc这个变量
-
print(nc) #输出.nc文档信息摘要
-
结果显示,我的nc数据包含1个数据变量GPP,以及2个维度数据latitude、longitude,除此之外,数据集的4个全局属性对整个数据集起说明的作用。
我们将这个数据集赋值给nc这个变量,通过class()函数我们可以看到nc的数据类型是ncdf4型。
从上一步的结果中得知,数据集共有3个变量GPP、latitude、longitude,下面以latitude为例演示对数据属性的提取。
示例代码如下:
ncatt_get( nc = nc, varid = 'latitude' ) #输出latitude的属性
如果只想输出其单位(units),则:
ncatt_get( nc, 'latitude', 'units' )
下面以latitude和sst为例演示如何读取变量中的数据。如果想读取变量的所有数据,则只需给出nc和varid参数值,以latitude为例:
lat <- ncvar_get( nc = nc, varid = 'latitude')
利用ncvar_get读取的数据是array型的,接下来的计算就可以用R处理了。
读取完数据之后,记得及时关闭文档:
nc_close( nc )
二、写入.nc格式数据
1、nc_create的用法
nc_create( filename, vars, force_v4=FALSE, verbose=FALSE )
nc_create用于创建新的.nc文档。其中,参数filename表示输出路径,vars表示文档中的变量,其数据类型需是ncvar4型(即由ncvar_def函数创建的数据),或者ncvar4型数据构成的list(数据有多个时);force_v4参数如果设置为TRUE,则表明创建的是ncdf4型文档(新版本的),FALSE表示创建的ncdf型文档。
2、ncvar_def的用法
ncvar_def( name, units, dim, missval, longname=name, prec="float", shuffle=FALSE, compression=NA, chunksizes=NA, verbose=FALSE )
ncvar_def用于创建新的变量。其中,参数name表示变量名,其数据类型需是character型;units便是变量的单位,其数据类型需是character型;dim表示变量的维度,其数据类型需是ncdim4型(即由ncdim_def函数创建的数据)或由ncdim4构成的list(维度为多个时);missval表示缺失值,如不需要可以不填,填NA则表示缺失值用NaN表示;longname表示更详细的名字,数据类型需是character型,默认值与name一致;prec表示数据的精度,可填’short’、’integer’、’float’、’double’或’char’;一般情况下,剩余变量可以保持默认值。
3、ncdim_def的用法
ncdim_def( name, units, vals, unlim=FALSE, create_dimvar=TRUE, calendar=NA, longname=name )
ncdim_def用于创建新的维度。其中,参数name表示维度名,其数据类型需是character型;units便是维度的单位,其数据类型需是character型;vals表示维度的值,数据类型需是numeric型向量;longname表示更详细的名字;calendar一般仅在维度是时间时设置,表示日期的计数方式,一般有"standard" ("gregorian")、"noleap" ("365_day")以及"360_day"三种选择;一般情况下,剩余变量可以保持默认值。
4、ncvar_add的用法
ncvar_add( nc, v, verbose=FALSE, indefine=FALSE )
ncvar_add用于给已经存在的.nc文档添加新的变量。其中,参数nc是即将进行添加操作的.nc数据集,其数据类型需是ncdf4型;v表示新添加的变量,其数据类型需是ncvar4型。
5、ncvar_put的用法
ncvar_put( nc, varid, vals, start=NA, count=NA, verbose=FALSE )
ncvar_put用于给新建的变量添加数据。其中,参数nc是即将进行添加操作的.nc数据集,其数据类型需是ncdf4型;varid表示进行添加数据操作的变量,其数据类型需是ncvar4型;vals表示数据值;start表示写入数值的起始位置(用法与ncvar_get相同);count表示写入数值的数目(用法与ncvar_get相同)。
6、ncatt_put的用法
ncatt_put( nc, varid, attname, attval, prec=NA, verbose=FALSE, definemode=FALSE )
ncatt_put用于给新建的变量或整个文档添加属性。其中,参数nc是即将进行添加操作的.nc数据集,其数据类型需是ncdf4型;varid表示进行添加数据操作的变量,其数据类型需是ncvar4型(varid设为0则表示给整个文档添加全局属性);attname表示属性名称;attval表示属性值;prec表示属性值的精度。
接下来,用一个例子说明上述函数的用法。在第一部分“读取.nc格式数据”,我们读取了2009年1月-12月的NINO3区sst数据,我们将其输出命名为“NINO3_2009.nc”,代码如下:
#创建维度,分别是time、longitude、latitude
longitude <- ncdim_def( name = 'longitude', units = 'degrees_east', vals = seq(-149.5,-90.5,1) )
latitude <- ncdim_def( name = 'latitude', units = 'degrees_north', vals = seq(4.5,-4.5,-1) )
t <- ncdim_def( name = 'time', units = 'months', vals = 1:12 )
#创建变量sst
sst <- ncvar_def( name = 'sst', units = 'C', dim = list(longitude,latitude,t), missval = NA, prec = 'double' )
#创建文档,命名为NINO3_2009.nc,只包含1个数据变量sst
ncnew <- nc_create( filename = 'NINO3_2009.nc', vars = sst )
longitude <- ncdim_def( name = 'longitude', units = 'degrees_east', vals = seq(-149.5,-90.5,1) )
latitude <- ncdim_def( name = 'latitude', units = 'degrees_north', vals = seq(4.5,-4.5,-1) )
t <- ncdim_def( name = 'time', units = 'months', vals = 1:12 )
#创建变量sst
sst <- ncvar_def( name = 'sst', units = 'C', dim = list(longitude,latitude,t), missval = NA, prec = 'double' )
#创建文档,命名为NINO3_2009.nc,只包含1个数据变量sst
ncnew <- nc_create( filename = 'NINO3_2009.nc', vars = sst )
#写入数据
ncvar_put( nc = ncnew, varid = sst, vals = sst_nino3 )
#写入属性
ncatt_put( nc = ncnew, varid = 0, attname = 'description', attval = 'sst data in NINO3 area during 2009')
#写入数据
ncvar_put( nc = ncnew, varid = sst, vals = sst_nino3 )
#写入属性
ncatt_put( nc = ncnew, varid = 0, attname = 'description', attval = 'sst data in NINO3 area during 2009')
#最后别忘了关闭.nc文档
nc_close(ncnew)
#完成之后,读取文档检查一下
nc <- nc_open('NINO3_2009.nc')
print(nc)
nc_close(nc)
结果如下:
备注:转载自偷闲阁,并适当修改,如有侵权请联系我。