2009-10-28 39 views
11

Tôi muốn lưu toàn bộ các khung dữ liệu tương đối lớn trong khi giảm thiểu dung lượng mà các tệp đó chiếm. Khi mở các tập tin, tôi cần để có thể kiểm soát những cái tên mà chúng được đưa ra trong không gian làm việc.Lưu khung dữ liệu dưới dạng tệp nhị phân

Về cơ bản, tôi đang tìm kiếm các tính năng symantics của dput và dget nhưng với các tệp nhị phân.

Ví dụ:

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 
} 

Trả lời

19

Tốt nhất là sử dụng các file RDA. Bạn có thể sử dụng save()load() lệnh để viết và đọc:

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

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

Edit: Để hoàn chỉnh, chỉ để trang trải những gì gợi ý Harlan thể trông như thế (tức là gói lệnh tải để trả lại khung dữ liệu):

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

loadx(a, "test.rda") 

Ngoài ra, có một cái nhìn tại hdf5, RNetCDF và ncdf gói. Tôi đã thử nghiệm với hdf5 package trong quá khứ; điều này sử dụng the NCSA HDF5 library. Nó rất đơn giản:

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

Một lựa chọn cuối cùng là sử dụng các kết nối tập tin nhị phân, nhưng điều đó sẽ không làm việc tốt trong trường hợp của bạn vì readBin và writeBin chỉ hỗ trợ vectơ:

Dưới đây là một ví dụ nhỏ. Đầu tiên viết một số dữ liệu với "w" và thêm "b" để kết nối:

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

Sau đó đọc dữ liệu với "r" và thêm "b" để kết nối:

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

Câu trả lời hay nhất Shane. Tôi muốn sử dụng 'lưu', nhưng không thích thực tế là tôi không thể kiểm soát tên của dữ liệu khi tải –

+0

Bạn có thể bọc hàm load() vào một hàm mới biết tên của dữ liệu trong tệp và đặt lại tên cho giá trị trả lại. Hàm tải sẽ chèn các biến vào môi trường/không gian tên của hàm. – Harlan

+0

Bạn có thể làm những gì Harlan đề nghị, hoặc bạn chỉ có thể lưu một dataframe cho mỗi tập tin, và cung cấp cho cả tệp và dataframe cùng tên. Sau đó, bạn sẽ có hành vi tương tự như những gì bạn mô tả ở trên với dput và dget, phải không? – Shane

12

Bạn có thể hãy xem saveRDSreadRDS. Chúng là các hàm cho tuần tự hóa.

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

saveRDS(x, file="myDataFile.rds") 
x <- readRDS(file="myDataFile.rds") 
+4

Hết sức tò mò: tại sao ai đó sử dụng lệnh này để lưu/tải? Có một số lợi ích đặc biệt không? – Shane

+1

Trong 2,13 chúng không còn là nội bộ nữa. Bạn sử dụng chúng khi bạn muốn lưu một đối tượng duy nhất, không phải nhiều đối tượng như 'save()' – hadley

+0

Tôi nhận được: Lỗi: không thể tìm thấy hàm "readRDS", tương tự cho saveRDS. Thư viện nào cần được tải? –

Các vấn đề liên quan