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" и т.д.
Ура!