2010-03-19 33 views
68

kiểm tra ví dụ này:write.table viết không mong muốn cột trống hàng đầu để tiêu đề khi có rownames

> a = matrix(1:9, nrow = 3, ncol = 3, dimnames = list(LETTERS[1:3], LETTERS[1:3])) 
> a 
    A B C 
A 1 4 7 
B 2 5 8 
C 3 6 9 

hiển thị bảng một cách chính xác. Có hai cách khác nhau để viết nó để nộp ...

write.csv(a, 'a.csv') mang đến cho như mong đợi:

"","A","B","C" 
"A",1,4,7 
"B",2,5,8 
"C",3,6,9 

write.table(a, 'a.txt') mà vít lên

"A" "B" "C" 
"A" 1 4 7 
"B" 2 5 8 
"C" 3 6 9 

thực sự, một tab trống là mất tích. ... đó là một nỗi đau trong mông cho những thứ hạ lưu. Đây có phải là lỗi hoặc tính năng không? Có cách giải quyết nào không? (Trừ write.table(cbind(rownames(a), a), 'a.txt', row.names=FALSE)

Chúc mừng, Yannick

Trả lời

97

Trích dẫn ?write.table, các file phần CSV:

Theo mặc định không có tên cột cho một cột tên hàng. Nếu col.names = NArow.names = TRUE tên cột trống được thêm vào, là quy ước được sử dụng cho tệp CSV là được đọc bởi bảng tính.

Vì vậy, bạn phải làm

write.table(a, 'a.txt', col.names=NA) 

và bạn nhận

"" "A" "B" "C" 
"A" 1 4 7 
"B" 2 5 8 
"C" 3 6 9 
+4

@Marek, bạn có thể thêm tên vào cột tên được không? I E., thay vì "", thêm "ID" hoặc một cái gì đó giống nhau? – Dnaiel

+2

@Dnaiel Từ những gì tôi biết bạn không thể. Bạn có thể liên kết tên hàng với dữ liệu và đặt tên cho chúng (giống như trong câu hỏi). – Marek

+1

@rusalkaguy Chỉnh sửa của bạn không có điểm. "Phần mở rộng" này là trong câu hỏi ban đầu ("workaround khác") – Marek

0

tôi sửa đổi một chức năng đơn giản từ @mnel, mà thêm sự linh hoạt bằng cách sử dụng các kết nối. Dưới đây là các chức năng:

my.write <- function(x, file, header, f = write.csv, ...){ 
# create and open the file connection 
datafile <- file(file, open = 'wt') 
# close on exit 
on.exit(close(datafile)) 
# if a header is defined, write it to the file (@CarlWitthoft's suggestion) 
if(!missing(header)) { 
writeLines(header,con=datafile, sep='\t') 
writeLines('', con=datafile, sep='\n') 
} 
# write the file using the defined function and required addition arguments 
f(x, datafile,...) 
} 

Bạn có thể chỉ định các chức năng để được 'write.table', 'write.csv', 'write.delim' vv

Cheers!

4

Sửa đổi nhỏ cho @Marek câu trả lời rất hữu ích S add thêm tiêu đề vào cột rownames: tạm thời thêm rownames làm cột đầu tiên trong data.frame và viết điều đó, bỏ qua các tên gọi thực.

> a = matrix(1:9, nrow = 3, ncol = 3, dimnames = list(LETTERS[1:3], LETTERS[1:3])) 
> write.table(data.frame("H"=rownames(a),a),"a.txt", row.names=FALSE) 

và bạn nhận

"H" "A" "B" "C" 
"A" 1 4 7 
"B" 2 5 8 
"C" 3 6 9 
+0

Bạn nên chỉnh sửa câu trả lời của Marek để bao gồm điều này, tôi nghĩ. – dorukayhan

3

Đối với bất cứ ai làm việc trong tidyverse (dplyr, vv), các rownames_to_column() chức năng từ gói tibble có thể được sử dụng để dễ dàng chuyển đổi row.names vào một cột, ví dụ:

library('tibble') 
a = as.data.frame(matrix(1:9, nrow=3, ncol=3, 
        dimnames=list(LETTERS[1:3], LETTERS[1:3]))) 

a %>% rownames_to_column('my_id') 

    my_id A B C 
1  A 1 4 7 
2  B 2 5 8 
3  C 3 6 9 

Kết hợp điều này với các tùy chọn trong row.names=FALSEwrite.table() kết quả ở đầu ra với những cái tên tiêu đề cho tất cả các cột.

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