Сохранение фрейма данных в виде двоичного файла - PullRequest
12 голосов
/ 28 октября 2009

Я хотел бы сохранить целую кучу относительно больших фреймов данных, при этом минимизируя пространство, занимаемое файлами. При открытии файлов мне нужно иметь возможность контролировать, какие имена им дают в рабочей области.

В основном я ищу символику dput и dget, но с двоичными файлами.

Пример:

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
}

Ответы [ 2 ]

22 голосов
/ 28 октября 2009

Лучше всего использовать файлы rda. Вы можете использовать команды save() и load() для записи и чтения:

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

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

Редактировать: Для полноты, просто чтобы охватить, как может выглядеть предложение Харлана (то есть, обернуть команду загрузки для возврата фрейма данных):

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

loadx(a, "test.rda")

Кроме того, взгляните на пакеты hdf5, RNetCDF и ncdf. Я экспериментировал с пакетом hdf5 в прошлом; здесь используется библиотека NCSA HDF5 . Все очень просто:

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

Последний вариант - использовать бинарные файловые соединения, но в вашем случае это не будет работать, потому что readBin и writeBin поддерживают только векторы:

Вот тривиальный пример. Сначала запишите некоторые данные с помощью «w» и добавьте «b» к соединению:

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

Затем прочитайте данные с помощью «r» и добавьте «b» к соединению:

zz <- file("testbin", "rb")
readBin(zz, integer(), 4)
close(zz)
12 голосов
/ 29 октября 2009

Вы можете взглянуть на saveRDS и readRDS. Они являются функциями для сериализации.

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

saveRDS(x, file="myDataFile.rds")
x <- readRDS(file="myDataFile.rds")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...