Как работать с файлами hdf5 в R?
У меня есть файл в формате hdf5
. Я знаю, что он должен быть матрицей, но я хочу прочитать эту матрицу в R
, чтобы я мог ее изучить. Я вижу, что есть пакет h5r
, который должен помочь с этим, но я не вижу никакого простого для чтения/понимания учебника. Это учебник доступен в Интернете. В частности, как вы читаете объект hdf5
с этим пакетом и как на самом деле извлекаете матрицу?
ОБНОВЛЕНИЕ
Я обнаружил пакет rhdf5
, который не является частью CRAN, но является частью BioConductoR. Интерфейс относительно прост для понимания документации и кода примера. Я мог бы использовать его без проблем. Моя проблема - это входной файл. Матрица, которую я хотел прочитать, фактически хранилась в файле hdf5
как python pickle
. Поэтому каждый раз, когда я пытался открыть его и доступ к нему через R
, я получил segmentation fault
. Я выяснил, как сохранить матрицу из python
в качестве файла tsv
, и теперь эта проблема решена.
Ответы
Ответ 1
Пакет rhdf5
работает очень хорошо, хотя его нет в CRAN. Установите его из Bioconductor
source("http://bioconductor.org/biocLite.R")
biocLite("rhdf5")
И использовать его:
library(rhdf5)
Перечислите объекты в файле, чтобы найти группу данных, которую вы хотите прочитать:
h5ls("path/to/file.h5")
Прочитайте данные HDF5:
mydata <- h5read("path/to/file.h5", "/mygroup/mydata")
И проверить структуру:
str(mydata)
(Обратите внимание, что многомерные массивы могут отображаться транспонированными). Также вы можете читать группы, которые будут называться списками в R.
Ответ 2
Вы также можете использовать h5, пакет, который я недавно опубликовал на CRAN.
По сравнению с rhdf5
он имеет следующие функции:
- Объектная модель S4 напрямую взаимодействует с объектами HDF5, такими как файлы, группы, наборы данных и атрибуты.
- Упрощенный синтаксис, реализованные R-подобные подмножества операторов для наборов данных, поддерживающих команды типа
readdata <- dataset[1:3, 1:3]
dataset[1:3, 1:3] <- matrix(1:9, nrow = 3)
- Поддерживаемые значения NA для всех типов данных
- 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 на
Ответ 3
Я использовал пакет rgdal
для чтения файлов HDF5. Вам нужно позаботиться о том, что, возможно, двоичная версия rgdal
не поддерживает hdf5
. В этом случае вам нужно построить gdal
из источника с поддержкой HDF5 до создания rgdal
из исходного кода.
В качестве альтернативы попробуйте преобразовать файлы с hdf5
в netcdf
. Как только они появятся в netcdf, вы можете использовать отличный пакет ncdf
для доступа к данным. Преобразование, я думаю, может быть сделано с помощью cdo
tool.
Ответ 4
Пакет ncdf4
, интерфейс для netCDF-4, также может использоваться для чтения файлов hdf5 (совместим с netCDF-4 с netCDF-3, но он использует hdf5 в качестве уровня хранения).
Произношение:
NetCDF-4 объединяет модели данных netCDF-3 и HDF5, используя желаемые характеристики каждого из них, используя при этом свои преимущества.
Формат netCDF-4 реализует и расширяет модель данных netCDF-3, используя расширенную версию HDF5 в качестве уровня хранения.
На практике ncdf4
предоставляет простой интерфейс, а перенос кода из старых пакетов hdf5
и ncdf
в один пакет ncdf4
сделал наш код, менее багги и легче писать (некоторые из моих проб и обходных решений описаны в моем предыдущем ответе).