首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R data.table。磁盘上fst文件的接口: fst_table

R data.table。磁盘上fst文件的接口: fst_table
EN

Stack Overflow用户
提问于 2020-03-22 09:18:47
回答 1查看 223关注 0票数 0

我想对一个大型数据集使用位于以下位置的包"fstpackage“中的fst_table函数:https://github.com/fstpackage/fsttable

代码语言:javascript
复制
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")

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

代码语言:javascript
复制
ft[X == 1,]

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

EN

回答 1

Stack Overflow用户

发布于 2021-11-09 11:38:29

原创

不幸的是,fsttable只适用于加载数据集和选择列/行。尽管在包的documentation中写道:

fst_table可用作常规data.table对象

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

代码语言:javascript
复制
> class(ft)
[1] "datatableinterface" "data.table"         "data.frame" 

但是,可以将来自fsttable对象的数据“提取”为向量,然后对其进行过滤。按照您的示例进行操作:

代码语言:javascript
复制
ft[,list(X)]$X
ft[,list(X)][['X']]
ft[,list(X)] %>% pull()

然后进行过滤,例如:

代码语言:javascript
复制
> ft[,list(X)]$X[ft[,list(X)]$X==1]
[1] 1

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

编辑

实际上,fst包的read_fst() (在CRAN中提供,由同一作者提供)有一个参数,将数据集作为data.table上传,而不需要fsttable

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60795025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档