2009-10-28 10 views
11

Chciałbym zapisać całą masę relatywnie dużych ramek danych, jednocześnie minimalizując ilość miejsca zajmowanego przez pliki. Podczas otwierania plików muszę mieć możliwość kontrolowania, jakie imiona są nadawane w obszarze roboczym.Zapisywanie ramki danych jako pliku binarnego

Zasadniczo szukam symantics dput i dget, ale z plikami binarnymi.

Przykład:

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 
} 

Odpowiedz

19

Najprościej jest użycie plików RDA. Można użyć save() i load() polecenia do zapisu i odczytu:

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

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

Edit: Dla kompletności, tak aby pokryć co sugestia Harlana może wyglądać (czyli owijania polecenie obciążenia, aby powrócić do ramki danych):

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

loadx(a, "test.rda") 

Alternatywnie, spojrzeć na hdf5, RNetCDF i ncdf pakietach. W przeszłości eksperymentowałem z hdf5 package; to używa the NCSA HDF5 library. To bardzo proste:

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

Ostatnią opcją jest użycie połączeń binarnych plików, ale to nie będzie dobrze działać w Twoim przypadku, ponieważ readBin i writeBin obsługuje tylko wektory:

Oto trywialny przykład. Pisać niektóre dane z „W” i dołączyć „B” do podłączenia:

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

następnie odczytać dane z „R” i dołączyć „B” do podłączenia:

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

Dobra odpowiedź Shane. Chciałbym użyć "save", ale nie podoba mi się to, że nie mogę kontrolować nazwy danych dotyczących ładowania –

+0

Można zawinąć funkcję load() w nowej funkcji, która zna nazwę danych w pliku i zmienia jego nazwę na wartość zwracaną. Funkcja load wstawi zmienne do środowiska/namespace funkcji. – Harlan

+0

Możesz zrobić to, co sugerował Harlan, lub po prostu zapisać jedną ramkę danych na plik i nadać plikowi i ramce danych tę samą nazwę. Wtedy będziesz miał takie samo zachowanie jak to, co opisałeś powyżej w dput i dget, prawda? – Shane

12

Użytkownik może spójrz na saveRDS i readRDS. Są to funkcje do serializacji.

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

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

Z ciekawości: dlaczego ktoś użyłby tych opcji zamiast zapisywania/ładowania? Czy jest jakaś szczególna korzyść? – Shane

+1

W wersji 2.13 nie są już wewnętrzne. Używa się ich, gdy chcemy zapisać pojedynczy obiekt, a nie wiele obiektów takich jak 'save()' – hadley

+0

Otrzymuję: Błąd: nie można znaleźć funkcji "readRDS", to samo dla saveRDS. Jaką bibliotekę należy załadować? –

Powiązane problemy