如何从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)) 

我在下面尝试了一下,下面是将4维netCDF数据导入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, function(i) {
b <- brick("download.nc", 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

最新更新