Сохранение фрейма данных в виде двоичного файла
-
06-07-2019 - |
Вопрос
Я хотел бы сохранить целую кучу относительно больших фреймов данных, минимизируя при этом пространство, занимаемое файлами.При открытии файлов мне нужно иметь возможность контролировать, какие имена им присваиваются в рабочей области.
По сути, я ищу символику 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
}
Решение
Лучше всего использовать файлы 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")
Редактировать: Для полноты картины, просто чтобы описать, как могло бы выглядеть предложение Харлана (т.е.обертывание команды load для возврата фрейма данных):
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)
Другие советы
Вы можете взглянуть на saveRDS
и readRDS
.Это функции для сериализации.
x = data.frame(x1=runif(10), x2=runif(10), x3=runif(10))
saveRDS(x, file="myDataFile.rds")
x <- readRDS(file="myDataFile.rds")