write.table ghi cột trống ở đầu không mong muốn vào tiêu đề khi có tên hàng


89

kiểm tra ví dụ này:

> 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

bảng hiển thị chính xác. Có hai cách khác nhau để ghi nó vào tệp ...

write.csv(a, 'a.csv') mang lại như mong đợi:

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

write.table(a, 'a.txt')cái nào bắt vít

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

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

Chúc mừng, yannick

Câu trả lời:


136

Trích dẫn ?write.table, phần tệp 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 = TRUEtên cột trống được thêm vào, đó là quy ước được sử dụng cho các tệp CSV được bảng tính đọc.

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

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

và bạn nhận được

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

4
@Marek, có thể thêm tên vào cột tên hàng không? Tức là, thay vì "", hãy 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 (như trong câu hỏi).
Marek

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

Làm thế nào bạn có được số trong mỗi cột để xếp hàng dưới tên col?
rrs

@rrs Ý bạn là định dạng chiều rộng cố định? Nhìn vào write.fwf từ gói gdata . Và đặt câu hỏi mới thay vì bình luận. Và tại sao bạn cần điều đó ?!
Marek

10

Một sửa đổi nhỏ đối với câu trả lời rất hữu ích @Marek SẼ thêm tiêu đề vào cột tên hàng: tạm thời thêm tên hàng làm cột đầu tiên trong data.frame và viết nó, bỏ qua tên hàng 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 được

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

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ĩ.
user8397947

3

Đối với bất kỳ ai làm việc trong ngăn nắp (dplyr, v.v.), rownames_to_column()hàm từ gói tibble có thể được sử dụng để dễ dàng chuyển đổi row.names thành 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 row.names=FALSEtùy chọn trong write.table()kết quả đầu ra với tên tiêu đề cho tất cả các cột.


1

Đối với những người gặp phải vấn đề tương tự khi lưu ma trận với write.table()và muốn giữ lại cột row.names, thực sự có một giải pháp cực kỳ đơn giản:

 write.table(matrix,file="file.csv",quote=F,sep=";", row.names=T
             col.names=c("row_name_col;val1_col","val2_col"))

Bằng cách làm đó, về cơ bản, bạn đang lừa write.tablehàm tạo nhãn tiêu đề cho cột row.names. Tệp .csv kết quả sẽ giống như sau:

row_name_col;val1_col;val2_col
row1;1;4 
row2;2;5 
row3;3;6 

Tôi đang thử col.names = c ("row_name", colnames (matrix)) và gặp lỗi cho biết đặc tả 'col.names' không hợp lệ. Bất cứ ý tưởng gì là sai? c ("row_name", colnames (matrix)) cung cấp văn bản chính xác.
MichaelE

write.tablemong đợi một tiêu đề có độ dài ncol(matrix)và bạn đang cung cấp cho nó một tiêu đề nữa. Tôi đã thử giải pháp trên, nó không hoạt động, tốt nhất là di chuyển tên hàng thành một cột giống như trong các giải pháp khác
aurelien

0

Tôi đã sửa đổi một chức năng đơn giản từ @mnel, chức năng này thêm tính linh hoạt bằng cách sử dụng các kết nối. Đây là 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 hàm là 'write.table', 'write.csv', 'write.delim', v.v.

Chúc mừng!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.