データフレームをバイナリファイルとして保存する

StackOverflow https://stackoverflow.com/questions/1635278

  •  06-07-2019
  •  | 
  •  

質問

ファイルが占有するスペースを最小限に抑えながら、比較的大きなデータフレームを大量に保存したいと思います。ファイルを開くとき、ワークスペースで指定する名前を制御できるようにする必要があります。

基本的に、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はベクターのみをサポートしているため、これはうまく機能しません:

これは簡単な例です。最初に&quot; w&quot;でデータを書き込みます&quot; b&quot;を追加します接続へ:

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

次に、「r」でデータを読み取ります。 &quot; b&quot;を追加します接続へ:

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