当前位置: 首页 > 知识库问答 >
问题:

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

龙令雪
2023-03-14

我已经搜索了很长时间,但仍然无法弄清楚这一点。似乎光栅包是要提取的,但只能从二维数据中提取。

这个四维数据的例子,一个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?

如果有人能帮忙,我将不胜感激。蝙蝠

共有1个答案

高胜
2023-03-14

光栅包是为三维数据(x、y和时间)设置的,但您可以在第四维上循环。这里有重叠

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
 类似资料:
  • 一个与R有关的新手问题。如何使用R从netdcf文件中提取特定位置的时间序列数据。例如,下面的快照显示位置(1、2)的时间序列为13、28、43。 提前谢谢。

  • 我在1998-01-01到1998-12-31期间使用TRMM_3B42_Daily产品创建了这个文件。这是我在R中使用的脚本: 通过这个链接,我试图提取值来绘制时间序列,但似乎我正在平均两个单元格的值,而不仅仅是提取单个单元格的值。我该如何解决这个问题?有没有办法创建一个循环,以便它提取不同单元格的值?(在这种情况下,它将是13 x 21=273) 我还发现了另外两个问题,即 excel 文件中

  • 我一直在寻找退出来解决我的问题,但我仍然无法解决它。我想将一个 nedCDF 文件导入 R 中。喜欢这个: 我得到以下内容 然后我想提取降水数据,例如一天中的一个网格单元: 但是我收到错误消息,例如:n_prec[1, 1, 1, 1]中的错误:错误的尺寸数 我不明白,因为数据集有维度。但是我可能误解了一些东西,因为我对r很陌生。 我很高兴得到任何帮助。曼纽尔

  • 这是我第一次使用堆栈溢出,我的编码技术非常糟糕,我正在使用一个历史tos的NetCDF文件。我想提取特定lat和lon的tos数据。我有一个三维数组中的tos数据,lon和lat分别在一个二维矩阵中。问题是,我选择的lon和lat的行列组合与tos数组的行-列组合不一致。下面是我目前掌握的代码 我被困在这里,因为我的纬度和纬度矩阵的行和列数与 tos day1 数组的行和列号不对应。 如果你不明白

  • 问题: 我在R中有一个代码,可以从单个Aqua Modis网络CDF文件中提取每月海面温度(SST)值(见下文)。但是,我在一个文件夹中有一批 59 个 Aqua Modis netCDF 文件。 目的: 我的目标是从所有59个netCDF文件的每个netCDF中提取变量的经度、纬度和SST,使用函数stack::raster()将它们转换为光栅文件,然后处理这些文件。 我的数据框有 650 行,

  • 我有海洋pH、o2等的全球4D NetCDF文件。每个文件有1个变量和4个维度(时间、经度、纬度和深度)。我希望从不包含NA的每个单元格的最底部深度提取数据。我尝试使用带有负超实验室的NCO的nks: 但是,这只为我提供了最深的箱(即-5700米深度箱)的数据,输出了海洋中所有较浅区域的NaN。有没有办法以类似的方式提取数据,但指定我想要每个单元格最深的非 NaN 值? 我能够使用 R、CDO 或