R 中的 rhdf5 包和数组 - 存储模式列表与双精度
rhdf5 package and arrays in R - storage mode list vs double
我正在使用包 rhdf5 构建一个包含特定地理区域气候数据的大型 h5。
域在 space 中的维度为 48x47 (lonxlat) 点。
气候变量(降水量、温度...)以 2256 行 (48*47=2256) 和 248 列(每月 31 天为 8 observation/day)的矩阵组织。
为了满足目标模型的要求,我需要将 h5 数据集构建为 (time, lon, lat) (248,48,47) 形式。为此,我将观察矩阵转换为维度 c(48,47,248)(经度、纬度、时间)的数组,然后使用命令 'aperm' 切换维度的顺序。
但是,当我在 h5 文件中写入数据集时,我收到以下消息:
"Writing of this type of data not supported."
这里是我使用的代码:
# load package from bioconductor
require(rhdf5)
setwd("path/to/file")
lon <-read.csv("lon_h5.csv", header=FALSE)
lon <-as.matrix(lon) #matrix 48x47
lat <-read.csv("lat_h5.csv", header=FALSE)
lat<-as.matrix(lat) #matrix 48x47
h5createFile("file.h5")
h5createDataset("file.h5", "lon",c(48,47), storage.mode = "double")
h5createDataset("file.h5", "lat",c(48,47), storage.mode = "double")
h5write(lon, file="file.h5", name="lon")
h5write(lat, file="file.h5", name="lat")
tmp <-read.csv(file="temperature.csv", header=TRUE)
tmp = array(tmp,dim=c(48,47,248)) # it loops the 48 longitude points first, then the 47 latitude points, then 248 time steps
tmp = aperm(a=tmp,perm=c(3,1,2)) # switch the order of the dimensions, putting time first, then longitude, then latitude
h5createDataset("file.h5", "tmp",c(248,48,47), storage.mode = "double")
h5write(tmp, file="file.h5", name="tmp")
'Writing of this type of data not supported.'
数组有559488个元素(48*47*248),应该不是维数的问题。
我写矩阵没问题,比如lon和lat矩阵。有人知道包 rhdf5 是否有数组问题吗?
谢谢
更新:
显然这个问题与数组有一个 'list' 存储模式有关,它没有在 rhdf5 包中实现。
有人建议我使用
更改tmp的存储模式
storage.mode(tmp)="double"
但这行不通(错误 storage.mode(tmp) = "double" : (list) object cannot be coerced to type 'double')。
我试过了
tmp<-as.numeric(unlist(tmp))
但这会将我的数组的维度从 559488 个元素更改为 1262204908 (!!!) 个元素。
其他建议?
谢谢
如果有人对这个问题的解决方案感兴趣,可以在这里找到:
我正在使用包 rhdf5 构建一个包含特定地理区域气候数据的大型 h5。
域在 space 中的维度为 48x47 (lonxlat) 点。 气候变量(降水量、温度...)以 2256 行 (48*47=2256) 和 248 列(每月 31 天为 8 observation/day)的矩阵组织。
为了满足目标模型的要求,我需要将 h5 数据集构建为 (time, lon, lat) (248,48,47) 形式。为此,我将观察矩阵转换为维度 c(48,47,248)(经度、纬度、时间)的数组,然后使用命令 'aperm' 切换维度的顺序。
但是,当我在 h5 文件中写入数据集时,我收到以下消息: "Writing of this type of data not supported."
这里是我使用的代码:
# load package from bioconductor
require(rhdf5)
setwd("path/to/file")
lon <-read.csv("lon_h5.csv", header=FALSE)
lon <-as.matrix(lon) #matrix 48x47
lat <-read.csv("lat_h5.csv", header=FALSE)
lat<-as.matrix(lat) #matrix 48x47
h5createFile("file.h5")
h5createDataset("file.h5", "lon",c(48,47), storage.mode = "double")
h5createDataset("file.h5", "lat",c(48,47), storage.mode = "double")
h5write(lon, file="file.h5", name="lon")
h5write(lat, file="file.h5", name="lat")
tmp <-read.csv(file="temperature.csv", header=TRUE)
tmp = array(tmp,dim=c(48,47,248)) # it loops the 48 longitude points first, then the 47 latitude points, then 248 time steps
tmp = aperm(a=tmp,perm=c(3,1,2)) # switch the order of the dimensions, putting time first, then longitude, then latitude
h5createDataset("file.h5", "tmp",c(248,48,47), storage.mode = "double")
h5write(tmp, file="file.h5", name="tmp")
'Writing of this type of data not supported.'
数组有559488个元素(48*47*248),应该不是维数的问题。
我写矩阵没问题,比如lon和lat矩阵。有人知道包 rhdf5 是否有数组问题吗?
谢谢
更新: 显然这个问题与数组有一个 'list' 存储模式有关,它没有在 rhdf5 包中实现。
有人建议我使用
更改tmp的存储模式storage.mode(tmp)="double"
但这行不通(错误 storage.mode(tmp) = "double" : (list) object cannot be coerced to type 'double')。 我试过了
tmp<-as.numeric(unlist(tmp))
但这会将我的数组的维度从 559488 个元素更改为 1262204908 (!!!) 个元素。 其他建议? 谢谢
如果有人对这个问题的解决方案感兴趣,可以在这里找到: