write.table записує небажаний провідний порожній стовпець у заголовок, коли має імена рядків


91

перевірте цей приклад:

> 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

таблиця відображається правильно. Існує два різні способи записати його у файл ...

write.csv(a, 'a.csv') що дає, як очікувалося:

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

і write.table(a, 'a.txt')який гвинтить

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

справді, порожня вкладка відсутня .... що є болем у зад для речей нижче. Це помилка чи особливість? Чи є обхідне рішення? (крім write.table(cbind(rownames(a), a), 'a.txt', row.names=FALSE)

Вітайте, яннік

Відповіді:


140

Цитування ?write.table, розділи CSV-файлів :

За замовчуванням для стовпця імен рядків немає назви стовпця. Якщо col.names = NAі додано row.names = TRUEпорожнє ім'я стовпця, що є домовленістю, яка використовується для читання CSV-файлів електронними таблицями.

Тож ви повинні це зробити

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

і ви отримуєте

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

4
@Marek, чи можна було б додати ім'я до стовпця імен рядків? Тобто, замість "", додати "ID" чи щось подібне?
Днайель

2
@Dnaiel З того, що я знаю, ти не можеш. Ви можете зв’язати імена рядків із даними та дати їм імена (як, наприклад, у питанні).
Марек

1
@rusalkaguy Ваша редакція не має сенсу. Це "розширення" є оригінальним запитанням ("обхідний шлях, крім")
Марек

Як би ви отримали число в кожному стовпчику, яке вишикувалося б під іменами col?
rrs

@rrs Ви маєте на увазі формат фіксованої ширини? Подивіться на write.fwf з пакета gdata . І задайте нове питання замість коментаря. І навіщо вам це колись потрібно ?!
Марек

10

Невелика модифікація @Marek, дуже корисна відповідь, ДОДАЄ заголовок до стовпця імен рядків: тимчасово додайте імена рядків як перший стовпець в data.frame і напишіть це, ігноруючи справжні імена рядків.

> 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)

і ви отримуєте

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

Ви повинні редагувати відповідь Марека, щоб включити це, я думаю.
user8397947 07

3

Для всіх, хто працює в tidyverse (dplyr тощо), rownames_to_column()функція з пакета tibble може бути використана для легкого перетворення рядків.імен у стовпець, наприклад:

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

Поєднуючи це з row.names=FALSEопцією у write.table()результатах виводу з іменами заголовків для всіх стовпців.


1

Для тих, хто write.table()стикається з тією ж проблемою при збереженні матриці та хоче зберегти стовпець row.names, насправді існує надзвичайно просте рішення:

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

Роблячи це, ви в основному обманюєте write.tableфункцію у створенні мітки заголовка для стовпця row.names. Отриманий файл .csv виглядатиме так:

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

Я намагаюся col.names = c ("ім'я_ рядка", colnames (матриця)) і отримую повідомлення про помилку із вимовою недійсної специфікації "col.names". Будь-яка ідея, що не так? c ("row_name", colnames (матриця)) дає правильний текст.
MichaelE

write.tableочікуйте заголовка довжини, ncol(matrix)і ви даєте йому ще один. Я спробував вищевказане рішення, воно не працює, найкраще перемістити імена рядків як стовпець, як і в інших рішеннях
aurelien

0

Я переглянув просту функцію @mnel, яка додає гнучкості за допомогою з'єднань. Ось функція:

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,...)
}

Ви можете вказати функцію 'write.table', 'write.csv', 'write.delim' тощо.

На здоров’я!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.