2010-03-19 7 views
68

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

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

Приветствия, Янник

ответ

97

Приводя ?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, можно ли добавить имя в столбец rownames? I.e., вместо «" добавить «ID» или что-то подобное? – Dnaiel

+2

@ Dnaiel Из того, что я знаю, вы не можете. Вы можете связывать имена строк с данными и давать им имена (как в вопросе). – Marek

+1

@rusalkaguy У вашего редактирования нет смысла. Это «расширение» находится в исходном вопросе («обходной путь, отличный от») – Marek

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' и т.д.

Ура!

4

Небольшая модификация очень полезного ответа @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 
+0

Вы должны отредактировать ответ Марека, чтобы включить это, я думаю. – dorukayhan

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