Domanda

Vorrei salvare un sacco di frame di dati relativamente grandi, riducendo al minimo lo spazio occupato dai file. Quando apro i file, devo essere in grado di controllare quali nomi vengono assegnati nell'area di lavoro.

Fondamentalmente sto cercando le caratteristiche di dput e dget ma con i file binari.

Esempio:

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
}
È stato utile?

Soluzione

La soluzione migliore è utilizzare i file rda. Puoi usare i comandi save () e load () per scrivere e leggere:

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

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

Modifica: Per completezza, solo per comprendere quale potrebbe essere il suggerimento di Harlan (ovvero, racchiudendo il comando load per restituire il frame di dati):

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

loadx(a, "test.rda")

In alternativa, dai un'occhiata ai pacchetti hdf5, RNetCDF e ncdf. In passato ho sperimentato il pacchetto hdf5 ; questo utilizza la libreria NCSA HDF5 . È molto semplice:

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

Un'ultima opzione è quella di utilizzare le connessioni ai file binari, ma questo non funzionerà bene nel tuo caso perché readBin e writeBin supportano solo i vettori:

Ecco un esempio banale. Prima scrivi alcuni dati con " w " e aggiungi " b " alla connessione:

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

Quindi leggi i dati con " r " e aggiungi " b " alla connessione:

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

Altri suggerimenti

Puoi dare un'occhiata a saveRDS e readRDS . Sono funzioni per la serializzazione.

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

saveRDS(x, file="myDataFile.rds")
x <- readRDS(file="myDataFile.rds")
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top