2009-10-28 18 views
11

मैं अपेक्षाकृत बड़े डेटा फ्रेम का पूरा समूह सहेजना चाहता हूं जबकि फ़ाइलों को कम करने के स्थान को कम करना। फ़ाइलों को खोलते समय, मुझे कार्यक्षेत्र में दिए गए नामों को नियंत्रित करने में सक्षम होना चाहिए।एक बाइनरी फ़ाइल के रूप में डेटा फ्रेम को सहेजना

असल में मैं ड्यूटी और डेट के सिमेंटिक्स की तलाश में हूं लेकिन बाइनरी फाइलों के साथ।

उदाहरण:

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 
} 

उत्तर

19

आपका सबसे अच्छा शर्त आरडीए फ़ाइलों का उपयोग करने के लिए है।

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

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

संपादित करें:: पूर्णता के लिए, बस क्या Harlan के सुझाव की तरह लग रहे हो सकता है (यानी लोड आदेश लपेटकर डेटा फ्रेम वापस जाने के लिए) को कवर करने के: आप लिखने और पढ़ने के लिए save() और load() आदेशों का उपयोग कर सकते हैं

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

loadx(a, "test.rda") 

वैकल्पिक रूप से, HDF5, RNetCDF और ncdf संकुल पर एक नजर है। मैंने अतीत में hdf5 package के साथ प्रयोग किया है; यह the NCSA HDF5 library का उपयोग करता है। यह बहुत सरल है:

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

एक अंतिम विकल्प बाइनरी फ़ाइल कनेक्शन का उपयोग करने के लिए है, लेकिन यह आपके मामले में अच्छी तरह से काम नहीं करेगा क्योंकि readBin और writeBin केवल वैक्टर समर्थन करते हैं:

यहाँ एक तुच्छ उदाहरण है। पहले "डब्ल्यू" के साथ कुछ डेटा लिखने और कनेक्शन को संलग्न "बी":

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

तो "आर" के साथ डेटा को पढ़ने और कनेक्शन को संलग्न "बी":

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

अच्छा जवाब शेन। मैं 'सेव' का उपयोग करना चाहता हूं, लेकिन इस तथ्य को पसंद नहीं करता कि मैं –

+0

लोड करने पर डेटा के नाम को नियंत्रित नहीं कर सकता। आप लोड() फ़ंक्शन को एक नए फ़ंक्शन में लपेट सकते हैं जो डेटा के नाम को जानता है फ़ाइल में और इसे वापसी मूल्य के लिए नामित करता है। लोड फ़ंक्शन फ़ंक्शन के पर्यावरण/नेमस्पेस में चर डालेगा। – Harlan

+0

आप हारलन द्वारा सुझाए गए कार्यों को कर सकते हैं, या आप प्रति फ़ाइल एक डेटाफ्रेम को सहेज सकते हैं, और फ़ाइल और डेटा दोनों को उसी नाम से दे सकते हैं। तब आपके पास वही व्यवहार होगा जैसा आपने उपरोक्त वर्णित डिप और डेट के साथ किया है, है ना? – Shane

12

आप कर सकते हैं saveRDS और readRDS पर एक नज़र डालें। वे serialization के लिए काम कर रहे हैं।

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

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

जिज्ञासा से बाहर होगा: कोई इन्हें बचाने/लोड पर क्यों उपयोग करेगा? क्या कोई विशेष लाभ है? – Shane

+1

2.13 में वे अब आंतरिक नहीं हैं। जब आप एक ऑब्जेक्ट को सहेजना चाहते हैं तो आप उनका उपयोग करते हैं, 'सेव() ' – hadley

+0

जैसे कई ऑब्जेक्ट्स नहीं: मुझे त्रुटि: saveRDS के लिए" readRDS "फ़ंक्शन नहीं मिल सका। क्या पुस्तकालय लोड किया जाना चाहिए? –

संबंधित मुद्दे