2009-10-28 69 views
11

我想保存一大堆相對較大的數據幀,同時最小化文件佔用的空間。打開文件時,我需要能夠控制它們在工作區中給出的名稱。將數據幀保存爲二進制文件

基本上我在尋找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 
} 

回答

19

最好的辦法是使用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) 
+0

好的回答謝恩。我想使用'save',但不喜歡加載數據時無法控制數據名稱的事實 – 2009-10-28 15:00:38

+0

可以將load()函數包裝到一個知道數據名稱的新函數中在文件中並將其重命名爲返回值。加載函數將把變量插入到函數的環境/名稱空間中。 – Harlan 2009-10-28 15:22:26

+0

您可以執行Harlan建議的操作,或者您可以爲每個文件保存一個數據框,併爲文件和數據框同名。那麼你將會和上面用dput和dget描述的行爲一樣,對嗎? – Shane 2009-10-28 15:38:59

12

您可能看看saveRDSreadRDS。它們是序列化的函數。

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

saveRDS(x, file="myDataFile.rds") 
x <- readRDS(file="myDataFile.rds") 
+4

出於好奇:爲什麼有人會使用這些保存/加載?有一些特別的好處嗎? – Shane 2009-10-29 12:41:43

+1

2.13他們不再是內部的。當你想要保存單個對象時,你可以使用它們,而不是像'save()' – hadley 2011-04-20 14:01:27

+0

這樣的多個對象。我得到:Error:找不到saveRDS的函數「readRDS」。什麼庫需要加載? – 2011-09-20 19:54:31

相關問題