web-dev-qa-db-fra.com

Comment gérer les fichiers hdf5 dans R?

J'ai un fichier dans hdf5 format. Je sais que c'est censé être une matrice, mais je veux lire cette matrice dans R pour pouvoir l'étudier. Je vois qu'il y a un h5r package qui est censé aider à cela, mais je ne vois aucun tutoriel simple à lire/à comprendre. Un tel tutoriel est-il disponible en ligne? Plus précisément, comment lisez-vous un hdf5 objet avec ce package, et comment réellement extraire la matrice?

MISE À JOUR

J'ai découvert un package rhdf5 qui ne fait pas partie de CRAN mais fait partie de BioConductoR. L'interface est relativement plus facile à comprendre la documentation et l'exemple de code est assez clair. Je pourrais l'utiliser sans problème. Mon problème semble être le fichier d'entrée. La matrice que je voulais lire était en fait stockée dans le hdf5 fichier en tant que python pickle. Donc, chaque fois que j'essayais de l'ouvrir et d'y accéder via R j'ai un segmentation fault. J'ai compris comment enregistrer la matrice à partir de python en tant que fichier tsv et maintenant ce problème est résolu.

48
Sam

Le rhdf5 le package fonctionne très bien, bien qu'il ne soit pas dans CRAN. Installez-le depuis Bioconducteur

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

Et pour l'utiliser:

library(rhdf5)

Répertoriez les objets dans le fichier pour trouver le groupe de données que vous souhaitez lire:

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

Lisez 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.

41
Mike T

Vous pouvez également utiliser h5 , un package que j'ai récemment publié sur CRAN. Comparé à rhdf5, Il présente les caractéristiques suivantes:

  1. Modèle d'objet S4 pour interagir directement avec des objets HDF5 tels que des fichiers, des groupes, des jeux de données et des attributs.
  2. Syntaxe plus simple, implémentation d'opérateurs de sous-ensemble de type R pour les jeux de données prenant en charge des commandes telles que readdata <- dataset[1:3, 1:3] dataset[1:3, 1:3] <- matrix(1:9, nrow = 3)
  3. Valeurs NA prises en charge pour tous les types de données
  4. Plus de 200 cas de test avec une couverture de code de 80% +.

Pour enregistrer 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

20
user625626

J'ai utilisé le package rgdal pour lire les fichiers HDF5. Vous devez vous assurer que la version binaire de rgdal ne prend probablement pas en charge hdf5. Dans ce cas, vous devez créer gdal à partir de la source avec le support HDF5 avant de construire rgdal à partir de la source.

Vous pouvez également essayer de convertir les fichiers à partir de hdf5 à netcdf. Une fois qu'ils sont dans netcdf, vous pouvez utiliser l'excellent package ncdf pour accéder aux données. La conversion, je pense, pourrait être effectuée avec l'outil cdo .

5
Paul Hiemstra

Le ncdf4 package, une interface vers 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.

En pratique, ncdf4 fournit une interface simple et la migration du code à partir de l'ancien hdf5 et ncdf packages dans un seul ncdf4 le package a rendu notre code moins bogué et plus facile à écrire (certains de mes essais et solutions sont documentés dans ma réponse précédente ).

4
David LeBauer