Speichern eines Datenrahmens als Binärdatei
-
06-07-2019 - |
Frage
Ich möchte eine ganze Reihe von relativ großen Datenrahmen speichern, während der Raum zu minimieren, dass die Dateien in Anspruch nehmen. Wenn die Dateien zu öffnen, muss ich der Lage sein, zu kontrollieren, welche Namen sie im Arbeitsbereich angegeben.
Im Grunde suche ich nach dem symantics von dput und DGET aber mit Binärdateien.
Beispiel:
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
}
Lösung
Ihre beste Wette ist RDA-Dateien zu verwenden. Sie können die save()
verwenden und load()
Befehle zu schreiben und lesen:
set.seed(101)
a = data.frame(x1=runif(10), x2=runif(10), x3=runif(10))
save(a, file="test.rda")
load("test.rda")
Edit: Für Vollständigkeit, nur um zu decken, was Harlan Vorschlag aussehen könnte (das heißt den Ladebefehl Einwickeln den Datenrahmen zurück):
loadx <- function(x, file) {
load(file)
return(x)
}
loadx(a, "test.rda")
Alternativ haben einen Blick auf die hdf5, RNetCDF und ncdf Pakete. Ich habe experimentiert mit dem hdf5 Paket in der Vergangenheit; diese verwendet der NCSA HDF5 Bibliothek . Es ist sehr einfach:
hdf5save(fileout, ...)
hdf5load(file, load = TRUE, verbosity = 0, tidy = FALSE)
Eine letzte Option ist Binärdatei Verbindungen zu verwenden, aber das wird in Ihrem Fall, weil readBin und writeBin nur Support-Vektoren nicht gut funktionieren:
Hier ist ein triviales Beispiel. Zuerst schreiben Sie einige Daten mit „w“ und fügen Sie „b“, um die Verbindung:
zz <- file("testbin", "wb")
writeBin(1:10, zz)
close(zz)
Dann werden die Daten mit „r“ lesen und „b“ auf die Verbindung anfügen:
zz <- file("testbin", "rb")
readBin(zz, integer(), 4)
close(zz)
Andere Tipps
Sie können einen Blick auf saveRDS
und readRDS
haben. Sie sind Funktionen für die Serialisierung.
x = data.frame(x1=runif(10), x2=runif(10), x3=runif(10))
saveRDS(x, file="myDataFile.rds")
x <- readRDS(file="myDataFile.rds")