2009-10-28 25 views
11

Me gustaría guardar un montón de marcos de datos relativamente grandes al tiempo que minimizo el espacio que ocupan los archivos. Al abrir los archivos, necesito poder controlar qué nombres se les asignan en el espacio de trabajo.Guardar un marco de datos como un archivo binario

Básicamente estoy buscando la semántica de dput y dget pero con archivos binarios.

Ejemplo:

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 
} 

Respuesta

19

Su mejor opción es utilizar los archivos RDA. Puede utilizar los comandos save() y load() para escribir y leer:

set.seed(101) 
a = data.frame(x1=runif(10), x2=runif(10), x3=runif(10)) 

save(a, file="test.rda") 
load("test.rda") 

Editar: Para completar, sólo para cubrir lo que la sugerencia de Harlan podría ser similar (es decir, envolviendo el comando de carga para devolver la trama de datos):

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

loadx(a, "test.rda") 

Alternativamente, echar un vistazo a la hdf5, paquetes RNetCDF y NCDF. He experimentado con el hdf5 package en el pasado; esto usa the NCSA HDF5 library. Es muy simple:

hdf5save(fileout, ...) 
hdf5load(file, load = TRUE, verbosity = 0, tidy = FALSE) 

Una última opción es el uso de conexiones de archivos binarios, pero eso no va a funcionar bien en su caso porque readBin y writeBin sólo admiten vectores:

Aquí está un ejemplo trivial. En primer lugar escribir algunos datos con "w" y añadir "b" para la conexión:

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

Luego leen los datos con "r" y añadir "b" para la conexión:

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

Buena respuesta Shane. Me gustaría utilizar 'guardar', pero no me gusta el hecho de que no puedo controlar el nombre de los datos al cargar –

+0

Puede ajustar la función load() en una nueva función que conoce el nombre de los datos en el archivo y le cambia el nombre por un valor de retorno. La función de carga insertará las variables en el entorno/espacio de nombres de la función. – Harlan

+0

Puede hacer lo que Harlan sugirió, o simplemente puede guardar un marco de datos por archivo y dar el mismo nombre al archivo y al marco de datos. Entonces usted tendrá el mismo comportamiento que describió anteriormente con dput y dget, ¿verdad? – Shane

12

Usted puede echar un vistazo a saveRDS y readRDS. Son funciones para serialización.

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

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

Por curiosidad: ¿por qué alguien usaría esto más de guardar/cargar? ¿Hay algún beneficio particular? – Shane

+1

En 2.13 ya no son internos. Los usas cuando quieres guardar un solo objeto, no múltiples objetos como 'save()' – hadley

+0

Obtengo: Error: no pude encontrar la función "readRDS", igual para saveRDS. ¿Qué biblioteca necesita ser cargada? –

Cuestiones relacionadas