代码之家  ›  专栏  ›  技术社区  ›  Ian Fellows

将数据帧保存为二进制文件

r
  •  11
  • Ian Fellows  · 技术社区  · 15 年前

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

    基本上,我在寻找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
    }
    
    2 回复  |  直到 15 年前
        1
  •  23
  •   Shane    15 年前

    最好使用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 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)
    
        2
  •  12
  •   Collin    13 年前

    你可以看看 saveRDS readRDS . 它们是用于序列化的函数。

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