문제

파일이 차지하는 공간을 최소화하면서 비교적 큰 데이터 프레임을 많이 절약하고 싶습니다. 파일을 열 때 작업 공간에 제공된 이름을 제어 할 수 있어야합니다.

기본적으로 나는 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")
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top