studio - ¿Cómo lidiar con los archivos hdf5 en R?
leer csv en r (4)
Tengo un archivo en formato hdf5
. Sé que se supone que es una matriz, pero quiero leer esa matriz en R
para poder estudiarla. Veo que hay un paquete h5r
que debería ayudar con esto, pero no veo ningún tutorial sencillo de leer / entender. Es un tutorial de este tipo disponible en línea. Específicamente, ¿Cómo lees un objeto hdf5
con este paquete y cómo realmente extraes la matriz?
ACTUALIZAR
Descubrí un paquete rhdf5
que no es parte de CRAN pero es parte de BioConductoR. La interfaz es relativamente más fácil de entender, la documentación y el código de ejemplo es bastante claro. Podría usarlo sin problemas. Mi problema parece ser el archivo de entrada. La matriz que quería leer estaba realmente almacenada en el archivo hdf5
como un python pickle
. Así que cada vez que intentaba abrirlo y acceder a él a través de R
i obtenía un segmentation fault
. Descubrí cómo guardar la matriz desde python
como un archivo tsv
y ahora ese problema está resuelto.
El paquete ncdf4
, una interfaz para netCDF-4, también se puede utilizar para leer archivos hdf5 (netCDF-4 es compatible con netCDF-3, pero utiliza hdf5 como capa de almacenamiento).
En las palabras del desarrollador:
- El grupo HDF dice:
NetCDF-4 combina los modelos de datos netCDF-3 y HDF5, tomando las características deseables de cada uno, mientras aprovecha sus fortalezas separadas
- Unidata dice:
El formato netCDF-4 implementa y expande el modelo de datos netCDF-3 utilizando una versión mejorada de HDF5 como la capa de almacenamiento.
En la práctica, ncdf4
proporciona una interfaz simple, y migrar el código de usar los paquetes hdf5
y ncdf
a un solo paquete ncdf4
ha hecho que nuestro código tenga menos errores y sea más fácil de escribir (algunas de mis pruebas y soluciones están documentadas en mi respuesta anterior ).
El paquete rhdf5
funciona realmente bien, aunque no está en CRAN. Instalarlo desde Bioconductor
source("http://bioconductor.org/biocLite.R")
biocLite("rhdf5")
Y para usarlo:
library(rhdf5)
Liste los objetos dentro del archivo para encontrar el grupo de datos que desea leer:
h5ls("path/to/file.h5")
Lea los datos de HDF5:
mydata <- h5read("path/to/file.h5", "/mygroup/mydata")
E inspeccionar la estructura :
str(mydata)
(Tenga en cuenta que las matrices multidimensionales pueden aparecer transpuestas ). También puedes leer grupos, que se nombrarán listas en R.
También puedes usar h5 , un paquete que publiqué recientemente en CRAN. Comparado con rhdf5
tiene las siguientes características:
- Modelo de objetos S4 para interactuar directamente con objetos HDF5 como archivos, grupos, conjuntos de datos y atributos.
- Sintaxis más simple, se implementaron operadores de subconjunto tipo R para conjuntos de datos que admiten comandos como
readdata <- dataset[1:3, 1:3] dataset[1:3, 1:3] <- matrix(1:9, nrow = 3)
- Valores de NA soportados para todos los tipos de datos
- Más de 200 casos de prueba con un código de cobertura del 80% +.
Para guardar una matriz puedes usar:
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)
... y lea toda la matriz de nuevo en R:
file <- h5file("test.h5")
testmat_in <- file["testgroup", "testmat"][]
h5close(file)
Véase también h5 en
Utilicé el paquete rgdal
para leer archivos HDF5. rgdal
tener cuidado de que probablemente la versión binaria de rgdal
no admita hdf5
. En ese caso, necesita compilar gdal
desde la fuente con soporte HDF5 antes de rgdal
desde la fuente.
Alternativamente, intente y convierta los archivos de hdf5
a netcdf
. Una vez que estén en netcdf, puede usar el excelente paquete ncdf
para acceder a los datos. La conversión creo que podría hacerse con la herramienta cdo
.