【问题标题】:R data.table. interface to on-disk fst files: fst_tableR 数据表。磁盘上 fst 文件的接口:fst_table
【发布时间】:2020-03-22 01:18:46
【问题描述】:

我想将来自“fstpackage”包的 fst_table 函数用于大型数据集:https://github.com/fstpackage/fsttable

devtools::install_github("fstpackage/fsttable")
library(fsttable)
nr_of_rows <- 1e6
x <- data.table::data.table(X = 1:nr_of_rows, Y = LETTERS[1 + (1:nr_of_rows) %% 26])
fst::write_fst(x, "1.fst")
ft <- fst_table("1.fst")

我可以提取创建文件的行和列,但是,是否可以执行以下操作:

ft[X == 1,]

在标准 data.table 中?或者我可以创建这个 data.table 的键以进行快速序列化吗?我的目标是使用列的值提取数据,而不将所有数据集加载到内存中。

【问题讨论】:

  • 你也可以尝试使用RSQLite的索引SQL表。
  • 我是data.table的忠实粉丝,但你考虑过vroom吗?
  • 要检查 vroom,听起来很有希望。谢谢。

标签: r serialization data.table fst


【解决方案1】:

原创

不幸的是,fsttable 仅适用于加载数据集和选择列/行。虽然在包装的documentation 中说:

这个fst_table可以作为一个普通的data.table对象

现实情况是无法执行您提到的常规 data.table 操作(至少对于版本0.1.3)。其背后的主要原因是我们实际上不是在使用 data.table 对象,而是使用 data.table 接口:

> class(ft)
[1] "datatableinterface" "data.table"         "data.frame" 

但是,来自fsttable 对象的数据可以被“拉”为向量,然后进行过滤。按照你的例子:

ft[,list(X)]$X
ft[,list(X)][['X']]
ft[,list(X)] %>% pull()

然后过滤,例如:

> ft[,list(X)]$X[ft[,list(X)]$X==1]
[1] 1

我认为应该有一种简单的方法将fsttable 对象转换为真正的data.table,方法是拉取每个变量,然后将它们绑定在一起。

编辑

其实fst包的read_fst()(CRAN有,同作者)有一个参数上传数据集为data.table,不需要fsttable

ft <- read_fst("ft", as.data.table = T)

# if only a few columns are desired
ft <- read_fst("ft", columns = c("X"), as.data.table = T)

# if a tibble is needed
ft <- read_fst("ft", as.data.table = T) %>% as_tibble()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-13
    • 2021-03-29
    • 2011-04-28
    • 2018-04-07
    • 1970-01-01
    • 2011-04-26
    • 2012-01-16
    • 1970-01-01
    相关资源
    最近更新 更多