有什么方法可以在 R 中压缩数据框。我有一个外部文件,我想将它导入数据框。但是,由于数据很大,会导致内存错误。虽然我不确定压缩在 R 中是否有意义,因为它使用 RAM 内存来创建数据结构,但如果可以使用任何与压缩同义的东西,它真的会帮助我。
3 回答
也许现在回答这个问题为时已晚,但我想我最好分享一些最近在 R 中允许压缩数据帧的工作。目前,R 中有一个名为fst
( Lightning Fast Serialization of Data Frames for R)
的包,您可以在其中为您的数据框创建压缩fst
对象。详细的解释可以在fst-package 手册fst
中找到,但我将简要解释如何使用它以及一个对象占用多少空间。首先,让我们用一些数据创建一个数据框,然后检查这个数据框的大小,如下:
install.packages("pryr") # for object_size()
library(pryr)
N <- 1000 * 8
M <- 100
df <- data.frame(A = c(rep(strrep("A", M), N), rep(strrep("B", N), N)))
object_size(df)
# 73.3 kB
现在,让我们将此数据框转换为fst
对象,如下所示:
install.packages("fst") #install the package
library(fst) #load the package
path <- paste0(tempfile(), ".fst") #create a temporary '.fst' file
write_fst(df, path) #write the dataframe into the '.fst' file
ft <- fst(path) #load the data as an fst object
object_size(ft)
# 2.14 kB
.fst
创建文件的磁盘空间为434 bytes
. 您可以将ft
对象作为普通数据框处理(据我尝试)。
希望这可以帮助。
该data.table
包存储类似于数据帧的数据,但增加了一些效率,这可能会充分压缩您的数据。
更通用的解决方案是将您的数据加载到数据库中,而不是直接加载到 R 中,然后只从数据库中提取您需要的部分,sqldf 和 RSQLite 包可能会有所帮助。曾经有一个名为 SQLiteDF 的包使这个过程变得透明(数据在数据库中,但是在 R 中有一个对象,看起来和行为都像一个数据框,但从数据库中提取数据)。可以通过 CRAN 获得该软件包的存档副本,但可能需要进行一些工作才能使其与最新版本的 R 一起使用(该软件包的最新版本是 2009 年)。
评论中提到的 CRAN 任务视图页面上还有其他工具(向下滚动到“大内存”部分),它们讨论了其他一些可能性以及如何分析在 RAM 中使用的大数据。
如果你有一个比 ff 包更大的数据框,它可能会帮助你以更小的尺寸存储你的大数据。尝试查看 CRAN 上可用的 ff 包