1

我想将来自包“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 的键以进行快速序列化吗?我的目标是使用列的值提取数据,而不将所有数据集加载到内存中。

4

1 回答 1

0

原来的

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

fst_table可以用作常规data.table对象

现实情况是,您提到的常规data.table操作无法执行(至少对于 version 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

编辑

实际上,read_fst()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()
于 2021-11-09T11:38:28.537 回答