2009-10-28 7 views
11

Je souhaite enregistrer tout un tas 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.Enregistrement d'une trame de données en tant que fichier binaire

Fondamentalement, je cherche les symantics 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 
} 

Répondre

19

Votre meilleur pari est d'utiliser des fichiers rda. Vous pouvez utiliser les save() et load() commandes 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") 

Edit: Pour être complet, juste pour couvrir ce que la suggestion de Harlan pourrait ressembler (c.-à-enroulant la commande de charge pour renvoyer la trame de données):

loadx <- function(x, file) { 
    load(file) 
    return(x) 
} 

loadx(a, "test.rda") 

Sinon, jetez un oeil à la hdf5, les paquets RNetCDF et NCDF. J'ai expérimenté avec le hdf5 package dans le passé; cela utilise the NCSA HDF5 library. Il 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 fonctionne pas bien dans votre cas parce que readBin et writeBin prennent en charge que des vecteurs:

Voici un exemple trivial. Tout d'abord écrire des données avec « w » et ajouter « b » à la connexion:

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

lire ensuite les données avec « r » et ajouter « b » à la connexion:

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

Bonne réponse Shane. Je voudrais utiliser 'enregistrer', mais n'aime pas le fait que je ne peux pas contrôler le nom des données sur le chargement –

+0

Vous pouvez envelopper la fonction load() dans une nouvelle fonction qui connaît le nom des données dans le fichier et le renomme pour une valeur de retour. La fonction de chargement va insérer les variables dans l'environnement/espace de noms de la fonction. – Harlan

+0

Vous pouvez faire ce que Harlan vous a suggéré, ou vous pouvez simplement sauvegarder une image par fichier, et donner le même nom au fichier et à l'image. Ensuite, vous aurez le même comportement que ce que vous avez décrit ci-dessus avec dput et dget, non? – Shane

12

Vous pouvez jetez un oeil à saveRDS et readRDS. Ce sont des fonctions de sérialisation.

x = data.frame(x1=runif(10), x2=runif(10), x3=runif(10)) 

saveRDS(x, file="myDataFile.rds") 
x <- readRDS(file="myDataFile.rds") 
+4

Par curiosité: pourquoi quelqu'un les utiliserait-il plus de sauvegarder/charger? Y a-t-il un avantage particulier? – Shane

+1

Dans 2.13 ils ne sont plus internes. Vous les utilisez lorsque vous voulez enregistrer un seul objet, pas plusieurs objets comme 'save()' – hadley

+0

Je reçois: Erreur: impossible de trouver la fonction "readRDS", idem pour saveRDS. Quelle bibliothèque doit être chargée? –

Questions connexes