在R中,我想以跨平台格式将一个多维数组(比如10维或更多维,每个维可能有不同的长度)保存到磁盘中。由于这个原因,我排除了.rds
文件和saveRDS()
。
如果可能的话,我想使用箭头或 parquet 格式,从arrow
package,但我找不到正确的方式来保存一个数组。使用arrow::write_feather()
或_parquet
会出现错误“No method for as_arrow_table()
for object of class array”。
我发现了几个问题,如this,this,this,它们涉及到将数组保存到磁盘的一般问题,但似乎没有问题或答案使用箭头格式。也许这不可能?
1条答案
按热度按时间lymnna711#
*注意: 本讨论主要是关于 parquet 格式,它在几个方面与羽毛格式不同。我相信这两个结论是一样的,但我没有太多的羽毛经验,不知道它们是一样的。
https://parquet.apache.org:
面向列(在其他文档中称为“列”)实际上只是一个框架。
矩阵可以在转换为帧后存储:
为了在那里获得更多的维度,你需要重新塑造它的存储。这将受益于一些 parquet 的效率,但你不会得到“权力”的 parquet 过滤以同样的方式;值得注意的是,找到原始数据的特定切片/平面/子阵列将花费更多的工作和翻译。
我包含了
lapply(..)
步骤,因为as.data.frame.table
的默认操作是使用Var#
作为 * 因子 * 索引,即Var1
是c(A, B, A, B, ...)
。保留这些当然是好的,但我认为对于数组的数字索引的最接近的翻译,最好坚持使用数字。从数组索引到this的基本转换可能是这样的:
备注:
open_dataset
来表明这种机制可以很好地处理较大的数组数据集,您只需要提取其中的一小部分,并且不希望将所有数据都加载到RAM中。加载一个大的框架,然后重新整形,实际上会使数组/表的大小增加一倍。因此,dplyr
与arrow
在传递内存结果之前可以很好地进行延迟过滤/加载。(然而,由于dplyr
也只适用于帧,所以我不知道如何逻辑地/懒惰地进行整形。length(unique(z))
是因为我们需要先验地知道newary
的目标维数。match(z, unique(z))
步骤是必需的,因为矩阵索引将返回(例如)Var2
的值2和3,但newary
列索引应该是1和2,因此我们将返回值与唯一值匹配,以便适合newary
。额外的好处:这也适用于稀疏数据(即使目标数组不是真正的稀疏有效矩阵):