【问题标题】:Saving a data frame as a binary file将数据框保存为二进制文件
【发布时间】:2011-04-20 22:02:33
【问题描述】:

我想保存一大堆相对较大的数据帧,同时尽量减少文件占用的空间。打开文件时,我需要能够控制它们在工作区中的名称。

基本上我正在寻找 dput 和 dget 的语义,但使用二进制文件。

例子:

n<-10000

for(i in 1:100){
    dat<-data.frame(a=rep(c("Item 1","Item 2"),n/2),b=rnorm(n),
        c=rnorm(n),d=rnorm(n),e=rnorm(n))
    dput(dat,paste("data",i,sep=""))
}


##much later


##extract 3 random data sets and bind them
for(i in 1:10){
    nums<-sample(1:100,3)
    comb<-rbind(dget(paste("data",nums[1],sep="")),
            dget(paste("data",nums[2],sep="")),
            dget(paste("data",nums[3],sep="")))
    ##do stuff here
}

【问题讨论】:

    标签: r


    【解决方案1】:

    最好的办法是使用 rda 文件。您可以使用save()load() 命令进行读写:

    set.seed(101)
    a = data.frame(x1=runif(10), x2=runif(10), x3=runif(10))
    
    save(a, file="test.rda")
    load("test.rda")
    

    编辑:为了完整起见,只是为了涵盖哈兰的建议可能是什么样的(即包装加载命令以返回数据帧):

    loadx <- function(x, file) {
      load(file)
      return(x)
    }  
    
    loadx(a, "test.rda")
    

    或者,看看 hdf5、RNetCDF 和 ncdf 包。我过去曾尝试过hdf5 package;这使用the NCSA HDF5 library。很简单:

    hdf5save(fileout, ...)
    hdf5load(file, load = TRUE, verbosity = 0, tidy = FALSE)
    

    最后一个选项是使用二进制文件连接,但在你的情况下这不会很好,因为 readBin 和 writeBin 只支持向量:

    这是一个简单的例子。首先用“w”写入一些数据,并将“b”附加到连接:

    zz <- file("testbin", "wb")
    writeBin(1:10, zz)
    close(zz)
    

    然后用“r”读取数据并将“b”附加到连接:

    zz <- file("testbin", "rb")
    readBin(zz, integer(), 4)
    close(zz)
    

    【讨论】:

    • 很好的答案Shane。我想使用“保存”,但不喜欢我无法控制加载时数据的名称
    • 您可以将 load() 函数包装在一个新函数中,该函数知道文件中数据的名称并将其重命名为返回值。 load 函数会将变量插入到函数的环境/命名空间中。
    • 您可以按照 Harlan 的建议进行操作,或者您可以为每个文件保存一个数据帧,并为文件和数据帧提供相同的名称。那么您将具有与上面描述的 dput 和 dget 相同的行为,对吗?
    • 你基本上改造了loadRDS
    • 您可以将值为bzip2xzcompress 参数传递给save 以使用更有效的压缩算法。默认值为gzip。新命令将是 save(a, file="test.rda", compress="xz")
    【解决方案2】:

    您可以查看saveRDSreadRDS。它们是用于序列化的函数。

    x = data.frame(x1=runif(10), x2=runif(10), x3=runif(10))
    
    saveRDS(x, file="myDataFile.rds")
    x <- readRDS(file="myDataFile.rds")
    

    【讨论】:

    • 出于好奇:为什么有人会在保存/加载时使用这些?有什么特别的好处吗?
    • 在 2.13 中它们不再是内部的。当你想保存单个对象时使用它们,而不是像save() 这样的多个对象
    • 我得到:错误:找不到函数“readRDS”,与 saveRDS 相同。需要加载什么库?
    • mohawkjohn - 它们是基础 R 的一部分,无需加载任何内容即可使用它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多