R 将netCDF变量展开为附加维度或多个变量

R 将netCDF变量展开为附加维度或多个变量,r,raster,netcdf,R,Raster,Netcdf,我正在处理一个非常大的三维netCDF文件(lat/lon/time)。分辨率为300米,时间变量有25步,这导致64800x129600x25单元 文件中包含的一个变量是一个整数(范围从-36到120),但表示一个潜在因素,这就是问题所在。 它是一个土地覆盖数据集,因此,例如:-20表示单元属于土地类型森林,或10表示单元被水覆盖 我想重塑netCDF文件,这样就有一个额外的维度来表示原始变量的每个因子级别。然后,每个单元的变量仅为1或0,表示在某个lat/lon/时间存在每个因子水平。 然后

我正在处理一个非常大的三维netCDF文件(lat/lon/time)。分辨率为300米,时间变量有25步,这导致64800x129600x25单元

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

我想重塑netCDF文件,这样就有一个额外的维度来表示原始变量的每个因子级别。然后,每个单元的变量仅为1或0,表示在某个lat/lon/时间存在每个因子水平。 然后,尺寸将为lat/lon/time/land类型

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

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")
库(ncdf4)
#下载数据
下载文件(“http://schubert.atmos.colostate.edu/~csocom/code/air.sig995.2012.nc“,
mode=“wb”,destfile=“test.nc”)

test.ncdf如果我理解正确,您希望每个类型都有一组字段,作为lat/long/time的函数为1或0。e、 g.如果你正在寻找一个林,你需要一个数组,当因子=20时为1,否则为0

我知道你想在一个四维数组中这样做,因为你需要使用R,我希望你在标记问题时使用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
(我认为不需要花括号,但它的语法更清晰)


…在几行文字中几乎是你想要的,但不完全是。。。如果您真的需要,我不知道如何将这些新变量“叠加”到4D数组中,但也许nco可以做到。

如果我理解正确,您希望每个类型都有一组字段,作为lat/long/time的函数为1或0。e、 g.如果你正在寻找一个林,你需要一个数组,当因子=20时为1,否则为0

我知道你想在一个四维数组中这样做,因为你需要使用R,我希望你在标记问题时使用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
(我认为不需要花括号,但它的语法更清晰)

…在几行文字中几乎是你想要的,但不完全是。。。如果您真的需要,我不知道如何将这些新变量“堆叠”到4D数组中,但也许nco可以做到这一点