Enregistrement d'un cadre de données en tant que fichier binaire

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

  •  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
}
Était-ce utile?

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")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top