我想保存一大堆相对较大的数据帧,同时最大限度地减少文件占用的空间。打开文件时,我需要能够控制工作区中给出的名称。

基本上我正在寻找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
}
有帮助吗?

解决方案

您最好的选择是使用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")

编辑:为了完整起见,只是为了涵盖Harlan的建议(即包装load命令以返回数据框):

loadx <- function(x, file) {
  load(file)
  return(x)
}  

loadx(a, "test.rda")

或者,看一下hdf5,RNetCDF和ncdf包。我过去曾尝试过 hdf5软件包;这使用 NCSA HDF5库。这很简单:

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)

其他提示

您可以查看 saveRDS readRDS 。它们是序列化的功能。

x = data.frame(x1=runif(10), x2=runif(10), x3=runif(10))

saveRDS(x, file="myDataFile.rds")
x <- readRDS(file="myDataFile.rds")
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top