write.table записывает нежелательный ведущий пустой столбец в заголовок, когда имеет имена строк
-
21-09-2019 - |
Вопрос
проверьте этот пример:
> 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
)
Твое здоровье, янник
Решение
Цитирование ?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
Другие советы
Небольшое изменение в очень полезном ответе @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
Для всех, кто работает в аккуратная вселенная (dplyr и т.д.), the rownames_to_column()
функция из тиббл пакет можно использовать для простого преобразования 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()
выдает результат с именами заголовков для всех столбцов.
Для тех, кто сталкивается с такой же проблемой при сохранении матрицы с помощью 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
Я переработал простую функцию от @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" и т.д.
Ваше здоровье!