2013-04-12 3 views
39

У меня есть файл в формате hdf5. Я знаю, что он должен быть матрицей, но я хочу прочитать эту матрицу в R, чтобы я мог ее изучить. Я вижу, что есть пакет h5r, который должен помочь с этим, но я не вижу никакого простого для чтения/понимания учебника. Это учебник доступен в Интернете. В частности, как вы читаете объект hdf5 с этим пакетом и как на самом деле извлекаете матрицу?Как бороться с файлами hdf5 в R?

UPDATE

я обнаружил пакет rhdf5, который не является частью CRAN, но является частью Bioconductor. Интерфейс относительно прост для понимания документации и кода примера. Я мог бы использовать его без проблем. Моя проблема - это входной файл. Матрица, которую я хотел прочитать, фактически хранилась в файле hdf5 как python pickle. Поэтому каждый раз, когда я пытался открыть его и доступ к нему через R, я получил segmentation fault. Я выяснил, как сохранить матрицу в пределах python как файл tsv, и теперь эта проблема решена.

ответ

5

Я использовал пакет rgdal для чтения файлов HDF5. Вам нужно позаботиться о том, что, вероятно, двоичная версия rgdal не поддерживает hdf5. В этом случае вам нужно построить gdal из источника с поддержкой HDF5 до создания rgdal из источника.

Кроме того, попробуйте преобразовать файлы из hdf5 в netcdf. Как только они находятся в netcdf, вы можете использовать отличный пакет ncdf для доступа к данным. Преобразование, я думаю, может быть сделано с cdo tool.

+0

Можете ли вы показать мне код шаблона, как это сделать? – Sam

+1

Ваш вопрос прямо сейчас немного широк. Если у вас есть более конкретные вопросы, включая примеры кода, не стесняйтесь задавать больше вопросов. –

4

Пакет ncdf4, интерфейс для netCDF-4, также может использоваться для чтения файлов hdf5 (netCDF-4 совместим с netCDF-3, но в качестве уровня хранения он использует hdf5).

По словам разработчика:

NetCDF-4 сочетает в себе модели данных NetCDF-3 и hdf5, принимая желаемые характеристики каждого из них, в то время, пользуясь их отдельных прочностей

орудий формата NetCDF-4 и расширяет модель данных NetCDF-3, используя улучшенную версию HDF5 в качестве слоя для хранения.

На практике ncdf4 предоставляет простой интерфейс, и перенос кода с использованием старых hdf5 и ncdf пакетов в один ncdf4 пакет сделал our code меньше ошибок и проще писать (некоторые из моих испытаний и способы их устранения описаны в my previous answer).

33

Упаковка 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") 

И inspect the structure:

str(mydata) 

(Обратите внимание, что многомерные массивы may appear transposed). Также вы можете читать группы, которые будут называться списками в R.

+0

Очень хороший пакет. Сначала я думал об использовании пакета «h5r» из CRAN, но, похоже, он недокументирован. Если вы не возражаете, в зависимости от Bioconductor, тогда «rhdf5» определенно подходит. –

+4

Может быть полезно использовать функцию h5ls ("путь/to/file.h5") перед чтением в файле h5. –

+1

Это хорошее начало. Вот достойный учебник с подробностями об использовании rdhf5 http://www.r-bloggers.com/working-with-hdf-files-in-r-example-pathfinder-sst-data/ – mmann1123

14

Вы также можете использовать 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. Поддерживаемого Н.А. значения для всех типов данных
  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 на

+1

Не могли бы вы выделить наиболее важные различия между ' h5' и 'Rhdf5'? – krlmlr

+1

Как загрузить таблицу из составных таблиц? lat <- readDataSet (dataset ["table"]) Ошибка в eval (substitute (expr), envir, enc): Чтение составных типов данных еще не поддерживается. – BigChief

+1

Поддерживает ли пакет данных 'h5' пакет данных? – discipulus

Смежные вопросы