2013-01-08 38 views
7

Tôi đang cố gắng viết khung dữ liệu vào tệp gzip nhưng gặp sự cố.ghi tệp gzip từ khung dữ liệu

Dưới đây là ví dụ mã của tôi:

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

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

Lỗi trong writeLines(df1): không hợp lệ 'text' tranh luận

Bất kỳ lời đề nghị?

EDIT: một dòng ví dụ về vector nhân vật Tôi đang cố gắng để viết là:

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

Nhãn lớp/y-biến được tách ra từ x-vars bởi một "|" và biến tên được tách biệt với các giá trị bằng dấu ":" và dấu cách giữa các biến.

EDIT2: Tôi xin lỗi vì từ ngữ/định dạng của câu hỏi nhưng đây là kết quả: Old phương pháp:

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

Phương pháp mới:

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

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

Cảm ơn tất cả các bạn rất nhiều vì giúp tôi tìm ra điều này.

+0

Như thường hỏi về Rhelp: "Vấn đề gì bạn đang cố gắng để giải quyết". –

+0

Gợi ý: câu trả lời @DWin bình luận không phải là "Làm thế nào để tôi viết một khung dữ liệu vào một tệp gzip?" – Spacedman

+0

Câu hỏi dài hơn sẽ là "Nhanh hơn để viết tệp .txt hoặc tệp .gz từ R?" – screechOwl

Trả lời

16

writeLines mong đợi một danh sách các chuỗi. Cách đơn giản nhất để viết tệp này vào một tệp gzip sẽ là

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) 

Điều này sẽ viết nó dưới dạng gzipped csv. Ngoài ra, hãy xem write.tablewrite.csv2 để biết cách viết khác của tệp.

EDIT: Dựa trên các bản cập nhật cho bài về định dạng mong muốn, tôi đã helper sau (một cách nhanh chóng ném nhau, có lẽ thừa nhận tấn đơn giản hóa):

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=' ') 
     ) 
    }) 
} 

Vì vậy, đầu ra trông giống như

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 

Và tất cả những gì cần thiết là chuyển gzfile vào trong writeLines để có được kết quả mong muốn.

+0

Đối với những người sử dụng VW, xem thêm câu trả lời này cho các tùy chọn nhanh hơn 'writeLines': http://stackoverflow.com/a/41215573/3576984 – MichaelChirico

4

Để viết nội dung nào đó vào tệp gzip, bạn cần phải "tuần tự hóa" nó thành văn bản. Đối với các đối tượng R bạn có thể có một đâm vào đó bằng cách sử dụng dput:

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

Tuy nhiên bạn vừa viết một đoạn text của khung dữ liệu vào tập tin. Điều này khá có thể sẽ kém hiệu quả hơn khi sử dụng save(df1,file="df1.RData") để lưu nó vào một tệp dữ liệu R gốc. Hãy tự hỏi: tại sao tôi lưu nó dưới dạng tệp .gz?

Trong thử nghiệm nhanh với một số số ngẫu nhiên, tệp gz là 54k,.tập tin rdata là 34k

+0

Cảm ơn bạn. Lý do tôi viết cho .gz là đầu ra là một tệp đầu vào cho một chương trình khác đọc tệp .gz. Nói cách khác, nó rời khỏi hệ sinh thái R. Nếu không tôi sẽ sử dụng .RData. – screechOwl

+0

Vì vậy, chỉ cần gzip tệp .RData? Không, điều đó sẽ không hoạt động, bởi vì gzip là một nén cho bạn biết gì về định dạng của dữ liệu trong tệp khi không nén. Đây có phải là tệp CSV được nén, tệp NetCDF được nén, một tệp RData được nén không? Bạn đã không nói với chúng tôi. – Spacedman

+0

Xin lỗi, tôi đang sử dụng nó như một tập tin đầu vào cho một chương trình gọi là vowpal wabbit. Nó có một số phân cách kỳ lạ bằng cách sử dụng '|', ':' và ''. – screechOwl

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