Enregistrement d'un cadre de données en tant que fichier binaire
-
06-07-2019 - |
Question
Je souhaite enregistrer un grand nombre de trames de données relativement volumineuses tout en minimisant l'espace occupé par les fichiers. Lors de l'ouverture des fichiers, je dois pouvoir contrôler les noms qui leur sont donnés dans l'espace de travail.
En gros, je recherche les symantiques de dput et dget mais avec des fichiers binaires.
Exemple:
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
}
La solution
Votre meilleur pari est d’utiliser des fichiers RDA. Vous pouvez utiliser les commandes save ()
et load ()
pour écrire et lire:
set.seed(101)
a = data.frame(x1=runif(10), x2=runif(10), x3=runif(10))
save(a, file="test.rda")
load("test.rda")
Éditer: Par souci d’exhaustivité, il suffit de couvrir la suggestion de Harlan (c’est-à-dire en enveloppant la commande load pour renvoyer le bloc de données):
loadx <- function(x, file) {
load(file)
return(x)
}
loadx(a, "test.rda")
Vous pouvez également consulter les packages hdf5, RNetCDF et ncdf. J'ai déjà utilisé le paquet hdf5 par le passé; ceci utilise la la bibliothèque NCSA HDF5 . C'est très simple:
hdf5save(fileout, ...)
hdf5load(file, load = TRUE, verbosity = 0, tidy = FALSE)
Une dernière option consiste à utiliser des connexions de fichiers binaires, mais cela ne fonctionnera pas bien dans votre cas car readBin et writeBin ne prennent en charge que les vecteurs:
Voici un exemple trivial. Commencez par écrire des données avec " w " et ajoutez " b " à la connexion:
zz <- file("testbin", "wb")
writeBin(1:10, zz)
close(zz)
Ensuite, lisez les données avec " r " et ajoutez " b " à la connexion:
zz <- file("testbin", "rb")
readBin(zz, integer(), 4)
close(zz)
Autres conseils
Vous pouvez consulter saveRDS
et readRDS
. Ce sont des fonctions pour la sérialisation.
x = data.frame(x1=runif(10), x2=runif(10), x3=runif(10))
saveRDS(x, file="myDataFile.rds")
x <- readRDS(file="myDataFile.rds")