Pergunta

Eu gostaria de salvar um monte de relativamente grandes quadros de dados e minimizar o espaço que os arquivos ocupam. Ao abrir os arquivos, eu preciso ser capaz de controlar o que os nomes são dados no espaço de trabalho.

Basicamente eu estou olhando para os symantics de dput e DGET mas com arquivos binários.

Exemplo:

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
}
Foi útil?

Solução

Sua melhor aposta é usar arquivos rda. Você pode usar os comandos save() e load() para escrever e ler:

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, apenas para cobrir o que a sugestão de Harlan pode parecer (ou seja, envolvendo o comando de carregamento para retornar o quadro de dados):

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

loadx(a, "test.rda")

Como alternativa, ter um olhar para o hdf5, RNetCDF e pacotes ncdf. Eu experimentei com o hdf5 pacote no passado; Isto usa a biblioteca NCSA HDF5 . É muito simples:

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

A última opção é a utilização de conexões de arquivos binários, mas isso não vai funcionar bem no seu caso, porque readBin e writeBin só suportam vetores:

Aqui está um exemplo trivial. Primeiro escrever alguns dados com "w" e acrescentar "b" para a conexão:

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

Em seguida, ler os dados com "r" e acrescentar "b" para a conexão:

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

Outras dicas

Você pode ter um olhar para saveRDS e readRDS. Eles são funções para serialização.

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

saveRDS(x, file="myDataFile.rds")
x <- readRDS(file="myDataFile.rds")
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top