【问题标题】:How to deal with hdf5 files in R?如何处理 R 中的 hdf5 文件?
【发布时间】:2013-04-05 04:11:27
【问题描述】:

我有一个hdf5 格式的文件。我知道它应该是一个矩阵,但我想在R 中读取该矩阵,以便我可以研究它。我看到有一个 h5r 包应该可以帮助解决这个问题,但我没有看到任何简单易读/理解的教程。网上有这样的教程吗。具体来说,您如何使用此包读取hdf5 对象,以及如何实际提取矩阵?

更新

我发现了一个包rhdf5,它不是 CRAN 的一部分,而是 BioConductoR 的一部分。界面相对比较容易理解,文档和示例代码也比较清晰。我可以毫无问题地使用它。我的问题似乎是输入文件。我想读取的矩阵实际上以python pickle 的形式存储在hdf5 文件中。所以每次我尝试打开它并通过R 访问它时,我都会得到一个segmentation fault。我确实想出了如何将python 中的矩阵保存为tsv 文件,现在问题解决了。

【问题讨论】:

    标签: r hdf5


    【解决方案1】:

    rhdf5 包运行良好,尽管它不在 CRAN 中。从Bioconductor安装它

    # as of 2020-09-08, these are the updated instructions per
    # https://bioconductor.org/install/
    
    if (!requireNamespace("BiocManager", quietly = TRUE))
      install.packages("BiocManager")
    BiocManager::install(version = "3.11")
    

    并使用它:

    library(rhdf5)
    

    列出文件中的对象以找到要读取的数据组:

    h5ls("path/to/file.h5")
    

    读取 HDF5 数据:

    mydata <- h5read("path/to/file.h5", "/mygroup/mydata")
    

    还有inspect the structure

    str(mydata)
    

    (注意多维数组may appear transposed)。您还可以读取组,这些组将在 R 中命名为列表。

    【讨论】:

    • 确实是非常好的包。我正在考虑首先使用 CRAN 的 h5r 包,但它似乎没有充分记录。如果您不介意依赖 Bioconductor,那么 rhdf5 绝对是您的最佳选择。
    • 在读取 h5 文件之前使用函数 h5ls("path/to/file.h5") 会有所帮助。
    • 这是一个好的开始。这是一个不错的教程,详细介绍了rdhf5的使用r-bloggers.com/…
    • @Sam 我不明白“/mygroup/mydata”部分的内容,我在哪里可以看到这些信息?
    • @user4050 使用 h5ls 查看结构
    【解决方案2】:

    您也可以使用 h5,这是我最近在 CRAN 上发布的一个包。 与rhdf5相比,它具有以下特点:

    1. S4 对象模型可直接与文件、组、数据集和属性等 HDF5 对象进行交互。
    2. 更简单的语法,为支持命令的数据集实现了类似 R 的子集运算符 readdata <- dataset[1:3, 1:3] dataset[1:3, 1:3] <- matrix(1:9, nrow = 3)
    3. 支持所有数据类型的 NA 值
    4. 200 多个测试用例,代码覆盖率超过 80%。

    要保存矩阵,您可以使用:

    library(h5)
    testmat <- matrix(rnorm(120), ncol = 3)
    # Create HDF5 File
    file <- h5file("test.h5")
    # Save matrix to file in group 'testgroup' and datasetname 'testmat'
    file["testgroup", "testmat"] <- testmat
    # Close file
    h5close(file)
    

    ... 并将整个矩阵读回 R:

    file <- h5file("test.h5")
    testmat_in <- file["testgroup", "testmat"][]
    h5close(file)
    

    另见 h5

    【讨论】:

    • 您能否概述一下h5Rhdf5 之间最重要的区别?
    • 如何从复合表中加载表? lat
    • h5 包是否支持数据帧?
    • h5 已贬值以支持hdf5r
    【解决方案3】:

    ncdf4 包,netCDF-4 的接口,也可用于读取 hdf5 文件(netCDF-4 与 netCDF-3 兼容,但它使用 hdf5 作为存储层)。

    用开发者的话来说:

    NetCDF-4 结合了 netCDF-3 和 HDF5 数据模型,利用了各自的理想特性,同时利用了各自的优势

    netCDF-4 格式通过使用 HDF5 的增强版本作为存储层实现并扩展了 netCDF-3 数据模型。

    在实践中,ncdf4 提供了一个简单的接口,并且将代码从使用较旧的 hdf5ncdf 包迁移到单个 ncdf4 包使 our code 的错误更少并且更易于编写(我的一些试验和解决方法记录在 my previous answer)。

    【讨论】:

      【解决方案4】:

      我使用rgdal 包来读取HDF5 文件。您确实需要注意rgdal 的二进制版本可能不支持hdf5。在这种情况下,您需要从支持 HDF5 的源代码构建 gdal,然后再从源代码构建 rgdal

      或者,尝试将文件从hdf5 转换为netcdf。一旦它们在 netcdf 中,您就可以使用出色的 ncdf 包来访问数据。我认为可以使用cdo tool 完成转换。

      【讨论】:

      • 你能给我看一些模板代码吗?
      • 您现在的问题有点宽泛。如果您有更具体的问题,包括代码示例,请随时提出更多问题。