r - 如何从 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, 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
推荐阅读
- c++ - 为什么我会得到错误的“i”整数值?
- reactjs - 使用 React 创建多页面组件
- reactjs - 在 React Native 上进行用户身份验证的最佳方法?
- python - 内部类的调用函数
- tensorflow - ConvLSTM2d 在 colab GPU 上的运行速度比 CPU 慢
- python-3.x - 实际上,这段代码有错误,但如果我从代码中删除 (!= 1),我会得到意想不到的结果。但逻辑是一样的..请解释
- c - 在 C 中使用指针算法打印内存单元的内容
- javascript - 根据单选按钮值调用不同的 javascript 文件
- julia - 有没有可能改变Julia中非线性约束的RHS?
- pandas - 使用以下代码显示黑色列的热图