Write.table пишет нежелательный ведущий пустой столбец в заголовок, когда имеет имена ростов

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

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

Cheers, Янник

Ответ 1

Цитирование ?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

Ответ 2

Небольшая модификация очень полезного ответа на @Marek. Добавьте заголовок столбца rownames: временно добавьте имена розеток в качестве первого столбца в файле 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

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

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(), выводится вывод с именами заголовков для всех столбцов.

Ответ 4

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

Ура!