2009-10-28 13 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") 

編集:完全性については、ちょうどハーランの提案は(すなわち、データフレームを返すためにloadコマンドをラップする)ように見えるかもしれないものをカバーする:

また
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のみサポートベクトルので、あなたの場合にはうまく動作しません。

は、ここで簡単な例です。まず「ワット」といくつかのデータを書き込み、接続に「b」を追加します。

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

そして、「R」を使用してデータを読み、接続に「b」を追加します。

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

Nice answer Shane。私は '保存'を使用したいと思いますが、読み込み時にデータの名前を制御できないというのは好きではありません。 –

+0

データの名前を知っている新しい関数でload()関数をラップすることができます戻り値の名前を変更します。ロード関数は、関数の環境/名前空間に変数を挿入します。 – Harlan

+0

Harlanが提案したことを実行できます。ファイルごとに1つのデータフレームを保存し、ファイルとデータフレームの両方に同じ名前を付けることもできます。それで、dputとdgetを使って、上で説明したのと同じ動作をします。 – Shane

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

+1

2.13では、それらはもはや内部ではありません。 'save()'のような複数のオブジェクトではなく、一つのオブジェクトを保存したいときに使用します。 – hadley

+0

エラー:saveRDSと同じ "readRDS"関数が見つかりませんでした。どのライブラリをロードする必要がありますか? –

関連する問題