前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R海拾遗_hdf5r包

R海拾遗_hdf5r包

作者头像
火星娃统计
发布2021-02-05 16:40:13
1.4K0
发布2021-02-05 16:40:13
举报
文章被收录于专栏:火星娃统计火星娃统计

为大数据而生hdfr5

概述

hdf5文件是一种大数据存储结构,除了目前介绍的hdf5r包之外,同时cran中的h5包,Bioconductor中的rhdf5也能够实现类似的功能。

简单开始

创建文件、分组和数据集

代码语言:javascript
复制
library(hdf5r)
# 创建一个临时hdf5文件
test_filename <- tempfile(fileext = ".h5")
# 读取hdf5文件,如果存在则覆盖
file.h5 <- H5File$new(test_filename, mode = "w")

file.h5
# Class: H5File
# Filename: C:\Users\cmusunqi\TMP\Rtmp2Vb8Pj\file29ac4e56549a.h5
# Access type: H5F_ACC_RDWR

建立两个分组,一个分组用来装mtcars的数据,一个用于nycflights13

代码语言:javascript
复制
mtcars.grp <- file.h5$create_group("mtcars")
flights.grp <- file.h5$create_group("flights")

写入数据

代码语言:javascript
复制
library(datasets)
library(nycflights13)
library(reshape2)
# 在分组中加入数据
mtcars.grp[["mtcars"]] <- datasets::mtcars
# 飞行数据中放入天气数据
flights.grp[["weather"]] <- nycflights13::weather
# 飞行数据中放入航班数据
flights.grp[["flights"]] <- nycflights13::flights

从weather数据中提取站点为EWR的风向和风速数据,并保存为matrix,小时为列,日期为行

代码语言:javascript
复制
# 取子集,subset函数
weather_wind_dir <- subset(
    # 选择行
    nycflights13::weather, origin == "EWR", 
    # 选择列
    select = c("year", "month", "day", "hour", "wind_dir"))
# 去除存在缺失值的行
weather_wind_dir <- na.exclude(weather_wind_dir)
# 将风向转换为整数
weather_wind_dir$wind_dir <- as.integer(weather_wind_dir$wind_dir)
# acast为聚合函数,类似dcast
weather_wind_dir <- acast(
    weather_wind_dir, 
    year + month + day ~ hour, value.var = "wind_dir")
# 风向放入flights组中
flights.grp[["wind_dir"]] <- weather_wind_dir
# 对风速处理
weather_wind_speed <- subset(
    nycflights13::weather, origin == "EWR", 
    select = c("year","month", "day", "hour", "wind_speed"))
weather_wind_speed <- na.exclude(weather_wind_speed)
# 将长数据装换为宽数据的矩阵
weather_wind_speed <- acast(
    weather_wind_speed, 
    year + month + day ~ hour, value.var = "wind_speed")
# 将风速放入filght组中
flights.grp[["wind_speed"]] <- weather_wind_speed

定义attributes,也就是将风向和风速的行列名指定为特征

代码语言:javascript
复制
h5attr(flights.grp[["wind_dir"]], "colnames") <- colnames(weather_wind_dir)
h5attr(flights.grp[["wind_dir"]], "rownames") <- rownames(weather_wind_dir)
h5attr(flights.grp[["wind_speed"]], "colnames") <- colnames(weather_wind_speed)
h5attr(flights.grp[["wind_speed"]], "rownames") <- rownames(weather_wind_speed)

获取信息

这个比较重要,目前来看,我需要的其实是对数据的读取,至于制作hdf5文件,我想我应该暂时不会涉及

文件和组的信息
代码语言:javascript
复制
# 查看file.h5下的group
names(file.h5)
# [1] "flights" "mtcars"
# 查看filght组中有什么数据
names(flights.grp)
## [1] "flights"    "weather"    "wind_dir"   "wind_speed"

# ls函数,返回名字、连接类型、数据的维度等信息
flights.grp$ls()
##         name     link.type    obj_type num_attrs group.nlinks group.mounted
## 1    flights H5L_TYPE_HARD H5I_DATASET         0           NA            NA
## 2    weather H5L_TYPE_HARD H5I_DATASET         0           NA            NA
## 3   wind_dir H5L_TYPE_HARD H5I_DATASET         2           NA            NA
## 4 wind_speed H5L_TYPE_HARD H5I_DATASET         2           NA            NA
##   dataset.rank dataset.dims dataset.maxdims dataset.type_class
## 1            1       336776             Inf       H5T_COMPOUND
## 2            1        26115             Inf       H5T_COMPOUND
## 3            2     364 x 24       Inf x Inf        H5T_INTEGER
## 4            2     364 x 24       Inf x Inf        H5T_INTEGER
##   dataset.space_class committed_type
## 1          H5S_SIMPLE           <NA>
## 2          H5S_SIMPLE           <NA>
## 3          H5S_SIMPLE           <NA>
## 4          H5S_SIMPLE           <NA>
attributes, datatypes, datasets的信息

HDF5文件包含的信息较多,不仅仅需要获得组和文件名,同时也需要获得组中的信息。ls函数能够返回数据类型、数据大小、数据的维度、最大维度等信息。

数据类型

代码语言:javascript
复制
# 将天气数据集取出
weather_ds <- flights.grp[["weather"]]
# get_type查看类型为H5T_COMPOUND
weather_ds_type <- weather_ds$get_type()
# get_class不知道什么意思,数据类型?
weather_ds_type$get_class()
## [1] H5T_COMPOUND
## 13 Levels: H5T_NO_CLASS H5T_INTEGER H5T_FLOAT H5T_TIME ... H5T_NCLASSES
## 13 Values: -1 0 1 2 ... 11

通过cat显示get_type函数生成的内容

代码语言:javascript
复制
cat(weather_ds_type$to_text())
## H5T_COMPOUND {
##       H5T_STRING {
##          STRSIZE H5T_VARIABLE;
##          STRPAD H5T_STR_NULLTERM;
##          CSET H5T_CSET_ASCII;
##          CTYPE H5T_C_S1;
##       } "origin" : 0;
##       H5T_STD_I32LE "year" : 8;
##       H5T_STD_I32LE "month" : 12;
##       H5T_STD_I32LE "day" : 16;
##       H5T_STD_I32LE "hour" : 20;
##       H5T_IEEE_F64LE "temp" : 24;
##       H5T_IEEE_F64LE "dewp" : 32;
##       H5T_IEEE_F64LE "humid" : 40;
##       H5T_IEEE_F64LE "wind_dir" : 48;
##       H5T_IEEE_F64LE "wind_speed" : 56;
##       H5T_IEEE_F64LE "wind_gust" : 64;
##       H5T_IEEE_F64LE "precip" : 72;
##       H5T_IEEE_F64LE "pressure" : 80;
##       H5T_IEEE_F64LE "visib" : 88;
##       H5T_IEEE_F64LE "time_hour" : 96;
##    }
代码语言:javascript
复制
# 维度
weather_ds$dims
weather_ds$maxdims
weather_ds$chunk_dims

返回维度,最大维度,和chunk数

代码语言:javascript
复制
## [1] 26115
## [1] Inf
## [1] 78

查看属性,并查看具体的名字

代码语言:javascript
复制
# 查看风向表有什么属性
h5attr_names(flights.grp[["wind_dir"]])
## [1] "colnames" "rownames"
# 查看具体的属性
h5attr(flights.grp[["wind_dir"]], "colnames")
##  [1] "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14"
## [16] "15" "16" "17" "18" "19" "20" "21" "22" "23"
获取对象的详细信息(有些有问题)

在hdf5文件中,有很多种方式获得对象的详细信息,如:

  • get_obj_info: 关于属性数量、对象类型、引用计数、访问时间(如果记录)和其他更多技术信息的各种信息
  • get_link_info: 主要产生关于链接类型的信息,即:硬链接或软链接。
  • get_group_info: group的存储类型、是否已挂载文件以及组内项目的数量。对于普通用户来说,最感兴趣的信息是group中的项目数量,同时也可以使用names函数来检索。但是,对于非常大的group来说,这种方式更有效。
  • get_file_name: 对于一个H5File或H5Group, H5D或H5T(其中D代表数据集,T代表提交类型)对象,返回其所在文件的名称。
  • get_obj_name: 与get file_name类似,应用于同一个对象,但将文件内部的路径返回给对象
  • file_info: 它提取有关文件的技术性信息。它只能应用于类H5File的对象。

放入数据和删除数据

我们还希望能够读取数据、更改数据、扩展数据集并再次删除数据集。读取数据的方式与读取常规R数组和数据框的方式相同。然而,hdf5-table类型只有一个维度,因此,不可能有选择地读取列所有的列都必须在同一时间读取

代码语言:javascript
复制
# 读取1-5行的数据
weather_ds[1:5]
##   origin year month day hour  temp  dewp humid wind_dir wind_speed wind_gust
## 1    EWR 2013     1   1    1 39.02 26.06 59.37      270   10.35702        NA
## 2    EWR 2013     1   1    2 39.02 26.96 61.63      250    8.05546        NA
## 3    EWR 2013     1   1    3 39.02 28.04 64.43      240   11.50780        NA
## 4    EWR 2013     1   1    4 39.92 28.04 62.21      250   12.65858        NA
## 5    EWR 2013     1   1    5 39.02 28.04 64.43      260   12.65858        NA
##   precip pressure visib  time_hour
## 1      0   1012.0    10 1357020000
## 2      0   1012.3    10 1357023600
## 3      0   1012.5    10 1357027200
## 4      0   1012.2    10 1357030800
## 5      0   1011.9    10 1357034400


# 读取风向的前3行
# 风向为martix,所以可以同时选取
wind_dir_ds <- flights.grp[["wind_dir"]]
wind_dir_ds[1:3, ]
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
## [1,]    0    1    1    1    1    1    1    1    1     1     1     1     0     1
## [2,]    1    1    1    1    1    1    1    1    1     1     1     1     1     1
## [3,]    1    1    1    1    1    1    1    1    1     1     1     0     1     1
##      [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24]
## [1,]     1     1     1     1     1     1     1     1     1     1
## [2,]     1     1     1     1     1     1     1     1     1     1
## [3,]     1     1     1     1     1     1     1     1     1     1

# 替换第一行
wind_dir_ds[1, ] <- rep(1, 24)
wind_dir_ds[1, ]

也可以在数据集的维度之外添加数据,只要它们在maxdim内。数据集将被扩展以容纳新数据。当数据集的扩展导致未分配的点时,它们将被默认的填充值填充。一般为0

代码语言:javascript
复制
wind_dir_ds$get_fill_value()
## [1] 0
# 天趣1行25列的数字为1,其他位置自动添加0
wind_dir_ds[1, 25] <- 1
wind_dir_ds[1:2, ]

# 扩展了数据集,使其具有第25列,除了第一行外,其余都填充了Os,
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
## [1,]    1    1    1    1    1    1    1    1    1     1     1     1     1     1
## [2,]    1    1    1    1    1    1    1    1    1     1     1     1     1     1
##      [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
## [1,]     1     1     1     1     1     1     1     1     1     1     1
## [2,]     1     1     1     1     1     1     1     1     1     1     0

删除数据集

代码语言:javascript
复制
# 删除风向数据集
flights.grp$link_delete("wind_dir")
flights.grp$ls()

关闭文件

关闭文件有两个选项,关闭和关闭所有h5文件。

  • close将关闭文件,但已经打开的group和数据集将保持打开状态。此外,只要任何对象仍然打开,文件就不能以常规方式重新打开,因为HDF5禁止文件被多次打开。
  • close all关闭文件以及与文件关联的所有对象。任何指向该对象的r6类都将自动失效。
代码语言:javascript
复制
file.h5$close_all()

结束语

以上内容为hdfr5包的基本功能,当然还有一些高级功能,涉及创建文件和数据类型的内容

love&peace

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 火星娃统计 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为大数据而生hdfr5
    • 概述
      • 简单开始
        • 创建文件、分组和数据集
        • 获取信息
        • 放入数据和删除数据
        • 关闭文件
      • 结束语
      相关产品与服务
      大数据
      全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档