2013-01-08 15 views
7

Próbuję napisać ramkę danych do pliku gzip, ale mającego problemy.Napisz plik gzip z ramki danych

Oto mój przykładowy kod:

df1 <- data.frame(id = seq(1,10,1), var1 = runif(10), var2 = runif(10)) 

gz1 <- gzfile("df1.gz","w") 
writeLines(df1) 

Błąd w writeLines(df1): nieprawidłowy 'tekst' argumentem

sugestie?

EDIT: przykład linia wektor znaków Próbuję napisać to:

0 | var1:1.5 var2:.55 var7:1250 

Etykieta klasa/y-zmienna jest oddzielona od x-Vars przez "|" i zmiennej nazwy są oddzielone od wartości przez ":" i spacje między zmiennymi.

EDIT2: przepraszam za sformułowanie/formatu pytanie, ale oto wyniki: Stara metoda:

system.time(write(out1, file="out1.txt")) 
# user system elapsed 
# 9.772 17.205 86.860 

Nowa metoda:

writeGzFile <- function(){ 
    gz1 = gzfile("df1.gz","w"); 
    write(out1, gz1); 
    close(gz1) 
} 

system.time(writeGzFile()) 
# user system elapsed 
# 2.312 0.000 2.478 

Dziękuję wszystkim bardzo za pomóż mi to rozgryźć.

+0

Jak często zadawane na rhelp: "Jaki problem starasz się rozwiązać". –

+0

Podpowiedź: odpowiedź @DWin komentarz nie jest "Jak napisać ramkę danych do pliku gzip?" – Spacedman

+0

Dłuższe pytanie brzmi: "Czy szybciej jest napisać plik .txt lub .gz z R?" – screechOwl

Odpowiedz

16

writeLines oczekuje listy ciągów. Najprostszym sposobem, aby napisać to do pliku gzip byłoby

df1 <- data.frame(id = seq(1,10,1), var1 = runif(10), var2 = runif(10)) 
gz1 <- gzfile("df1.gz", "w") 
write.csv(df1, gz1) 
close(gz1) 

ten zapisze go jako csv zgzipowanego. Zobacz także write.table i write.csv2, aby uzyskać alternatywne sposoby zapisywania pliku.

EDIT: W oparciu o aktualizacjach słupka o żądanym formacie, zrobiłem następujące pomocnika (szybko wyrzucane razem, prawdopodobnie przyznaje ton uproszczenie):

function(df) { 
    rowCount <- nrow(df) 
    dfNames <- names(df) 
    dfNamesIndex <- length(dfNames) 
    sapply(1:rowCount, function(rowIndex) { 
     paste(rowIndex, '|', 
      paste(sapply(1:dfNamesIndex, function(element) { 
       c(dfNames[element], ':', df[rowIndex, element]) 
      }), collapse=' ') 
     ) 
    }) 
} 

więc wyjście wygląda jak

a <- data.frame(x=1:10,y=rnorm(10)) 
writeLines(myser(a)) 
# 1 | x : 1 y : -0.231340933021948 
# 2 | x : 2 y : 0.896777389870928 
# 3 | x : 3 y : -0.434875004781075 
# 4 | x : 4 y : -0.0269824962632977 
# 5 | x : 5 y : 0.67654540494899 
# 6 | x : 6 y : -1.96965253674725 
# 7 | x : 7 y : 0.0863177759402661 
# 8 | x : 8 y : -0.130116466571162 
# 9 | x : 9 y : 0.418337557610229 
# 10 | x : 10 y : -1.22890714891874 

A wszystko, co konieczne, to przekazanie pliku gz do linii poleceń, aby uzyskać pożądany wynik.

+0

Dla osób używających VW, zobacz także tę odpowiedź, aby uzyskać szybsze opcje niż 'writeLines': http://stackoverflow.com/a/41215573/3576984 – MichaelChirico

4

Aby napisać coś do pliku gzip, musisz "serializować" go do tekstu. Dla R obiektów można mieć ukłucie w które za pomocą dput:

gz1 = gzfile("df1.gz","w") 
dput(df1, gz1) 
close(gz1) 

Jednak właśnie pisemnej reprezentacji tekstowej ramki danych do pliku. Prawdopodobnie będzie to mniej wydajne niż użycie save(df1,file="df1.RData"), aby zapisać go w natywnym pliku danych R. Zadaj sobie pytanie: dlaczego zapisuję go jako plik .gz?

W szybkim teście z liczbami losowymi plik gz wynosił 54k,.Plik RData było 34k

+0

Dziękuję. Powodem, dla którego piszę do .gz jest to, że wynik jest plikiem wejściowym dla innego programu czytającego pliki .gz. Innymi słowy, opuszcza ekosystem R. W przeciwnym razie użyłbym .RData. – screechOwl

+0

Po prostu zapakuj plik .RData? Nie, to nie zadziała, ponieważ gzip to kompresja, która nie mówi nic o formacie danych w pliku po rozpakowaniu. Czy jest to spakowany plik CSV, spakowany plik NetCDF, spakowany plik RData? Nie powiedziałeś nam. – Spacedman

+0

Przepraszamy, używam go jako pliku wejściowego dla programu o nazwie vowpal wabbit. Ma dziwne ograniczenie przy użyciu "|", ":" i ". – screechOwl