Comment gérer les fichiers hdf5 en R?

j'ai un fichier au format hdf5 . Je sais que c'est censé être une matrice, mais je veux lire cette matrice dans R afin que je puisse l'étudier. Je vois qu'il y a un paquet h5r qui est supposé aider avec cela, mais je ne vois pas de tutoriel simple à lire/comprendre. Est un tutoriel disponible en ligne. Plus précisément, comment lire un objet hdf5 avec ce paquet, et comment extraire réellement la matrice?

mise à jour

j'ai trouvé un paquet rhdf5 qui ne fait pas partie du CRAN mais fait partie du Bioconducteur. L'interface est relativement plus facile à comprendre la documentation et le code d'exemple est assez clair. J'ai pu l'utiliser sans problèmes. Mon problème semble le fichier d'entrée. La matrice que je voulais lire était en fait stockée dans le fichier hdf5 en tant que python pickle . Donc chaque fois que j'ai essayé de l'ouvrir et d'y accéder par R j'ai eu un segmentation fault . Je j'ai trouvé comment sauvegarder la matrice dans python comme un fichier tsv et maintenant ce problème est résolu.

46
demandé sur Sam 2013-04-12 18:57:51

4 réponses

le paquet rhdf5 fonctionne très bien, bien qu'il ne soit pas dans CRAN. Installez-le à partir de Bioconducteur

source("http://bioconductor.org/biocLite.R")
biocLite("rhdf5")

et de l'utiliser:

library(rhdf5)

Liste des objets dans le fichier pour trouver le groupe de données que vous voulez lire:

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

lire les données HDF5:

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

et inspecter la structure :

str(mydata)

(notez que les tableaux multidimensionnels peuvent apparaître transposés ). Vous pouvez également lire des groupes, qui seront nommés listes dans R.

37
répondu Mike T 2017-05-23 12:32:28

vous pouvez aussi utiliser h5 , un paquet que j'ai récemment publié sur CRAN. Comparé à rhdf5 il présente les caractéristiques suivantes:

  1. S4 modèle d'objet pour interagir directement avec HDF5 des objets tels que des fichiers, des groupes, des ensembles de données et les attributs.
  2. syntaxe plus simple, mis en œuvre R-like subsetting operators pour les ensembles de données supportant des commandes comme readdata <- dataset[1:3, 1:3] dataset[1:3, 1:3] <- matrix(1:9, nrow = 3)
  3. Appuyé NA les valeurs de toutes les types de données
  4. 200 + cas D'essai avec une couverture de code de 80%+.

pour sauvegarder une matrice, vous pouvez utiliser:

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)

... et relisez la matrice entière dans R:

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

Voir aussi h5 sur

17
répondu user625626 2015-10-25 07:03:46

j'ai utilisé le paquet rgdal pour lire des fichiers HDF5. Vous devez prendre soin que probablement la version binaire de rgdal ne supporte pas hdf5 . Dans ce cas, vous devez construire gdal à partir des sources avec le support HDF5 avant de construire rgdal à partir des sources.

alternativement, essayez de convertir les fichiers de hdf5 en netcdf . Une fois qu'ils sont dans netcdf, vous pouvez utiliser l'excellent paquet ncdf pour accéder aux données. Le la conversion je pense pourrait être fait avec le cdo outil .

5
répondu Paul Hiemstra 2013-04-12 15:06:43

le paquet ncdf4 , une interface avec netCDF-4, peut également être utilisé pour lire des fichiers hdf5 (netCDF-4 est compatible avec netCDF-3, mais il utilise hdf5 comme couche de stockage).

dans les mots du développeur:

NetCDF-4 combine les modèles de données netCDF-3 et HDF5, en prenant les caractéristiques souhaitables de chacun, tout en tirant parti de leurs forces distinctes

le format netCDF-4 implémente et étend le modèle de données netCDF-3 en utilisant une version améliorée de HDF5 comme couche de stockage.

dans la pratique, ncdf4 fournit une interface simple, et le code de migration de l'utilisation plus ancienne hdf5 et ncdf paquets à un seul ncdf4 paquet a fait notre code moins buggé et plus facile à écrire (certains de mes essais et les solutions de contournement sont documentées dans ma réponse précédente ).

4
répondu David LeBauer 2017-05-23 11:46:43