如何从R中的四维netCDF数据中提取值?

问题描述

我已经搜索了很长时间,但仍然无法弄清楚。好像是栅格数据包是要提取的数据包,但只能从二维数据中提取

在这个以三维数据为例的示例中,netCDF文件包含连续三天(72小时)的每小时压力水平(4个水平)空气温度。 https://drive.google.com/file/d/1UIiX9-xHrtH2FT1torg53iPxyzLxSYQu/view?usp=sharing

我只是想在对应的日期时间和海拔高度(压力水平)上的某些点位置(xy)延长温度。然后将此添加为此参考数据中的其他列:
ref_df <- structure(list(Latitude = c(40.68,45.64,50.31,51.17,44.493564),Longitude = c(96.29,97.107,98.21,100.67,105.01),timestamp = c("2019-05-01 15:52:14","2019-05-01 18:52:29","2019-05-02 21:52:30","2019-05-03 00:52:29","2019-05-03 03:52:15"),altitude_hPa = c(530,570,590,600,610)),class = "data.frame",row.names = c(NA,-5L)) 

我按照下面的Import 4 dimensional netCDF data into R进行了以下尝试:但是似乎没有用。

library(ncdf4)
ncdata <- nc_open(ncfile)
temp <- ncvar_get(ncdata)
dim(temp) # this shows index of layers in each dimention,but how to link this?

如果有人可以提供帮助,我深表感谢。蝙蝠

解决方法

raster软件包是为3维数据(x,y和时间)设置的,但是您可以在4维上循环。 lapply在这里:

library(raster)
xy <- matrix(c(96.29,97.11,98.21,100.67,105.01,40.68,45.64,50.31,51.17,44.49),ncol=2)
colnames(xy) <- c("lon","lat")

v <- lapply(1:4,function(i) {
      b <- brick("download.nc",level=i)
      s <-  extract(b,xy)
    })

v是一个包含四个元素的列表(每个压力水平一个元素)。每个元素都有一个矩阵,该矩阵的行数与xy相同,列数与download.nc中的日期数

或获得像这样的单个矩阵:

v <- lapply(1:4,level=i)
      s <- cbind(level=i,extract(b,xy))
    })  

vv <- do.call(rbind,v)

vv[1:8,1:3]
#      level X2019.05.01.00.00.00 X2019.05.01.01.00.00
#[1,]     1             259.8976             259.9743
#[2,]     1             254.7902             255.7008
#[3,]     1             250.4961             250.6820
#[4,]     1             251.0643             250.8548
#[5,]     1             250.0989             250.1968
#[6,]     2             265.6487             265.6842
#[7,]     2             258.4251             259.0856
#[8,]     2             256.4043             256.4468