The ncdfCF package provides an easy to use interface to
netCDF resources in R, either in local files or remotely on a THREDDS
server. It is built on the RNetCDF package which, like
package ncdf4, provides a basic interface to the
netcdf library, but which lacks an intuitive user
interface. Package ncdfCF provides a high-level interface
using functions and methods that are familiar to the R user. It reads
the structural metadata and also the attributes upon opening the
resource. In the process, the ncdfCF package also applies
CF Metadata Conventions to interpret the data.
Opening and inspecting the contents of a netCDF resource is very straightforward:
library(ncdfCF)
# Get any netCDF file
fn <- system.file("extdata", "ERA5land_Rwanda_20160101.nc", package = "ncdfCF")
# Open the file, all metadata is read
(ds <- open_ncdf(fn))
#> <Dataset> ERA5land_Rwanda_20160101
#> Resource : /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/library/ncdfCF/extdata/ERA5land_Rwanda_20160101.nc
#> Format : offset64
#> Collection : Generic netCDF data
#> Conventions: CF-1.6
#>
#> Variables:
#> name long_name units data_type axes
#> t2m 2 metre temperature K NC_DOUBLE longitude, latitude, time
#> pev Potential evaporation m NC_DOUBLE longitude, latitude, time
#> tp Total precipitation m NC_DOUBLE longitude, latitude, time
#>
#> Attributes:
#> name type length value
#> Conventions NC_CHAR 6 CF-1.6
#> history NC_CHAR 34 Attributes simplified for example.You can convert a suitable R object into a CFVariable
instance quite easily. R objects that are supported include arrays,
matrices and vectors of type logical, integer, numeric or logical.
If the R object has dimnames set, these will be used to
create more informed axes. More interestingly, if your array represents
some spatial data you can give your dimnames appropriate
names (“lat”, “lon”, “latitude”, “longitude”, case-insensitive) and the
corresponding axis will be created (if the coordinate values in the
dimnames are within the domain of the axis type). For
“time” coordinates, these are automatically detected irrespective of the
name.
# Note the use of named dimnames: these will become the names of the axes
arr <- array(rnorm(120), dim = c(6, 5, 4))
dimnames(arr) <- list(lat = c(45, 44, 43, 42, 41, 40), lon = c(0, 1, 2, 3, 4),
time = c("2025-07-01", "2025-07-02", "2025-07-03", "2025-07-04"))
(obj <- as_CF("a_new_CF_object", arr))
#> <Variable> a_new_CF_object
#>
#> Values: [-2.59647 ... 2.487776]
#> NA: 0 (0.0%)
#>
#> Axes:
#> axis name length values unit
#> Y lat 6 [45 ... 40] degrees_north
#> X lon 5 [0 ... 4] degrees_east
#> T time 4 [2025-07-01 ... 2025-07-04] days since 1970-01-01T00:00:00
#>
#> Attributes:
#> name type length value
#> actual_range NC_DOUBLE 2 -2.59647, 2.487776
# Axes are of a specific type and have basic attributes set
obj$axes[["lat"]]
#> <Latitude axis> [-2] lat
#> Length : 6
#> Axis : Y
#> Coordinates: 45, 44, 43, 42, 41, 40 (degrees_north)
#> Bounds : (not set)
#>
#> Attributes:
#> name type length value
#> actual_range NC_DOUBLE 2 40, 45
#> axis NC_CHAR 1 Y
#> standard_name NC_CHAR 8 latitude
#> units NC_CHAR 13 degrees_north
obj$axes[["time"]]
#> <Time axis> [-4] time
#> Length : 4
#> Axis : T
#> Calendar : standard
#> Range : 2025-07-01 ... 2025-07-04 (days)
#> Bounds : (not set)
#>
#> Attributes:
#> name type length value
#> actual_range NC_DOUBLE 2 20270, 20273
#> axis NC_CHAR 1 T
#> standard_name NC_CHAR 4 time
#> units NC_CHAR 30 days since 1970-01-01T00:00:00
#> calendar NC_CHAR 8 standardYou can further modify the resulting CFVariable by
setting other properties, such as attributes or a coordinate reference
system. Once the object is complete, you can export or save it.
More detailed operations and options are given on the package web site.
Package ncdfCF is still being developed. It supports
reading of all data objects from netCDF resources in “classic” and
“netcdf4” formats; and can write data variables back to a netCDF file.
From the CF Metadata Conventions it supports identification of axes,
interpretation of the “time” axis, name resolution when using groups,
cell boundary information, auxiliary coordinate variables, labels, cell
measures, attributes and grid mapping information, among others.
Development plans for the near future focus on supporting the below features:
Package ncdfCF is still being developed. While
extensively tested on multiple well-structured data sets, errors may
still occur, particularly in data sets that do not adhere to the CF
Metadata Conventions. The API may still change and although care is
taken not to make breaking changes, sometimes this is unavoidable.
Installation from CRAN of the latest release:
install.packages("ncdfCF")
You can install the development version of ncdfCF from
GitHub with:
# install.packages("devtools")
devtools::install_github("R-CF/ncdfCF")