【问题标题】:Expand a netCDF Variable into an additional Dimension or multiple Variables将 netCDF 变量扩展为附加维度或多个变量
【发布时间】:2017-08-15 16:10:42
【问题描述】:

我正在处理一个非常大的三个维度(纬度/经度/时间)的 netCDF 文件。分辨率为 300 米,时间变量为 25 步,即 64800x129600x25 个单元。

文件中包含的一个变量是一个整数(范围从 -36 到 120),但代表了一个潜在因素,这就是问题所在。 它是一个土地覆盖数据集,例如:-20 表示该单元格属于土地类型 Forest 或 10 表示该单元格被

我想重塑 netCDF 文件,以便有一个额外的维度来表示原始变量的每个因子水平。然后变量将只是每个单元格的 1 或 0,表示在某个纬度/经度/时间存在每个因子水平。 然后维度将是纬度/经度/时间/土地类型

Here 是一个示例数据集,它与土地类型无关,但足够小,可以用于测试。这里有一些代码可以阅读:

library(ncdf4)
# Download the data
download.file("http://schubert.atmos.colostate.edu/~cslocum/code/air.sig995.2012.nc", 
          mode="wb", destfile = "test.nc")
test.ncdf <- nc_open("test.nc", write=TRUE)
# See the lon,lat,time dimensions
print(test.ncdf)
tmp.array <- ncvar_get(test.ncdf, varid="air")

我不确定raster 包是否更适合这项任务。对于非常小的 netCDF 文件,我通过提取数据然后将其堆叠为 data.frame,在某种程度上管理了预期的结果。

任何帮助或指出正确的方向将不胜感激。 提前致谢。

【问题讨论】:

    标签: r raster netcdf


    【解决方案1】:

    如果我理解正确,您希望为每个 type 设置一组字段,它们是 1 或 0,作为 lat/long/time 的函数。例如如果你正在寻找一个森林,你想要一个数组,当因子 = 20 时为 1,否则为 0。

    我知道您想在 4 维数组中执行此操作,因为您需要在标记问题时使用我期望的 R。但是如果你不介意有一系列类型的 3D 数组,一个快速简单的方法是使用 CDO 来处理整数数组

    cdo eqc,-20 air.sig995.2012.nc test.nc
    

    问题在于输出变量仍然具有相同的名称 (你没有说它叫什么,所以我把它称为sfctype),所以你需要用nco更改元数据。

    因此,更好的方法是在 cdo 中使用 expr

    cdo expr,"forest=sfctype==-20" air.sig995.2012.nc forest.nc
    

    这会产生一个名为 forest 的新变量,它是 1 或 0。 您现在可以处理所有需要的类型,然后将它们合并到一个文件中:

     cdo expr,"forest=(sfctype==-20)" air.sig995.2012.nc type_forest.nc
     cdo expr,"forest=(sfctype==10)" air.sig995.2012.nc type_water.nc
     ...etc...
     cdo merge type_*.nc combined_file.nc
    

    (我认为你不需要大括号,但它的语法更清晰)

    ...几乎几行代码就是你想要的,但并不完全... 需要,但也许 nco 可以做到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 2022-07-08
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 2014-08-23
      相关资源
      最近更新 更多