write.table записывает нежелательный ведущий пустой столбец в заголовок, когда есть имена строк - PullRequest
80 голосов
/ 19 марта 2010

проверьте этот пример:

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

Ура, Янник

Ответы [ 5 ]

121 голосов
/ 19 марта 2010

Цитирование ?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
6 голосов
/ 08 июля 2016

Небольшая модификация очень полезного ответа @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
3 голосов
/ 26 января 2017

Для всех, кто работает в 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 голос
/ 08 апреля 2018

Для тех, кто испытывает ту же проблему при сохранении матрицы с 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 
0 голосов
/ 03 мая 2015

Я пересмотрел простую функцию из @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» и т. Д.

ура!

...