2010-03-19 8 views
68

Überprüfung dieses Beispiel hat:write.table schreibt unerwünschte führende leere Spalte auf Header, wenn 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 

die Tabelle richtig angezeigt wird. Es gibt zwei verschiedene Arten des Schreibens es in Datei ...

write.csv(a, 'a.csv'), die wie erwartet gibt:

"","A","B","C" 
"A",1,4,7 
"B",2,5,8 
"C",3,6,9 

und write.table(a, 'a.txt') die Schrauben bis

"A" "B" "C" 
"A" 1 4 7 
"B" 2 5 8 
"C" 3 6 9 

in der Tat, ein leerer Tab fehlt. ... was für Downstream-Dinger schmerzhaft ist. Ist das ein Fehler oder eine Funktion? Gibt es eine Problemumgehung? (Ausgenommen write.table(cbind(rownames(a), a), 'a.txt', row.names=FALSE)

Cheers, yannick

Antwort

97

Unter Berufung auf ?write.table, Abschnitt CSV-Dateien:

standardmäßig kein Spaltenname für eine Spalte der Zeile Namen. Wenn col.names = NA und row.names = TRUE eine leere Spalte Name hinzugefügt wird, die Konvention für CSV-Dateien zu lesen Tabellenkalkulation verwendet wird.

So müssen Sie

write.table(a, 'a.txt', col.names=NA) 

tun, und Sie bekommen

"" "A" "B" "C" 
"A" 1 4 7 
"B" 2 5 8 
"C" 3 6 9 
+4

@Marek, wäre es möglich, einen Namen zu der Spalte rownames hinzuzufügen? I.e., anstatt "", fügen Sie "ID" oder etwas Ähnliches hinzu? – Dnaiel

+2

@Dnaiel Von dem, was ich weiß, können Sie nicht. Sie können Zeilennamen mit Daten verknüpfen und ihnen Namen geben (wie in Frage). – Marek

+1

@rusalkaguy Ihre Bearbeitung hat keinen Sinn. Diese "Erweiterung" ist in der ursprünglichen Frage ("Workaround anders als") – Marek

0

ich eine einfache Funktion von @mnel überarbeitet, die Flexibilität Verbindungen unter Verwendung ergänzt. Hier ist die Funktion:

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,...) 
} 

Sie die Funktion angeben 'write.table', 'write.csv', 'write.delim' usw.

Beifall zu sein!

4

Eine kleine Änderung an @Marek sehr hilfreiche Antwort wird eine Überschrift zu der rownames Spalte hinzufügen: vorübergehend hinzufügen die rownames als erste Spalte in der data.frame, und schreibe das, die tatsächlichen rownames ignorieren.

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

und Sie erhalten

"H" "A" "B" "C" 
"A" 1 4 7 
"B" 2 5 8 
"C" 3 6 9 
+0

Sie sollten Mareks Antwort bearbeiten, um das aufzunehmen, denke ich. – dorukayhan

3

für jedermann in der tidyverse Arbeits (dplyr, etc.), die rownames_to_column() Funktion aus dem tibble Paket verwendet leicht row.names auf eine Säule konvertieren werden kann, zB:

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 

dies mit der Option row.names=FALSE in write.table() Ergebnisse in der Ausgabe mit Kopf Namen Kombination für alle Spalten.