我想对一个大型数据集使用位于以下位置的包"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的键以进行快速序列化吗?我的目标是使用列的值提取数据,而无需将所有数据集加载到内存中。
发布于 2021-11-09 11:38:29
原创
不幸的是,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()https://stackoverflow.com/questions/60795025
复制相似问题