문제
파일이 차지하는 공간을 최소화하면서 비교적 큰 데이터 프레임을 많이 절약하고 싶습니다. 파일을 열 때 작업 공간에 제공된 이름을 제어 할 수 있어야합니다.
기본적으로 나는 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")
편집하다: 완전성을 위해 Harlan의 제안이 어떻게 보일지를 다루기 위해 (즉,로드 명령을 래핑하여 데이터 프레임을 반환) :
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")
제휴하지 않습니다 StackOverflow