Pregunta

Me gustaría guardar un montón de marcos de datos relativamente grandes mientras minimizo el espacio que ocupan los archivos. Al abrir los archivos, necesito poder controlar qué nombres se les da en el espacio de trabajo.

Básicamente estoy buscando la sintaxis 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
}
¿Fue útil?

Solución

Su mejor opción es usar archivos rda. Puede usar 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, solo para cubrir el aspecto que podría tener la sugerencia de Harlan (es decir, envolver el comando de carga para devolver el marco de datos):

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

loadx(a, "test.rda")

Alternativamente, eche un vistazo a los paquetes hdf5, RNetCDF y ncdf. He experimentado con el paquete hdf5 en el pasado; esto utiliza la biblioteca NCSA HDF5 . Es muy simple:

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

Una última opción es usar conexiones de archivos binarios, pero eso no funcionará bien en su caso porque readBin y writeBin solo admiten vectores:

Aquí hay un ejemplo trivial. Primero escriba algunos datos con & w; w " y anexar "b" a la conexión:

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

Luego lea los datos con " r " y anexar "b" a la conexión:

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

Otros consejos

Puede echar un vistazo a saveRDS y readRDS . Son funciones para la serialización.

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

saveRDS(x, file="myDataFile.rds")
x <- readRDS(file="myDataFile.rds")
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top