wake-up-neo.com

write.table schreibt eine unerwünschte führende leere Spalte in die Kopfzeile, wenn der Name geändert wurde

überprüfen Sie dieses Beispiel:

> 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 wird korrekt angezeigt. Es gibt zwei Möglichkeiten, es in eine Datei zu schreiben ...

write.csv(a, 'a.csv') was wie erwartet ergibt:

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

und write.table(a, 'a.txt') die vermasselt

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

in der Tat fehlt eine leere Lasche ... was für die nachgelagerten Dinge schmerzhaft ist. Ist das ein Fehler oder eine Funktion? Gibt es eine Problemumgehung? (außer write.table(cbind(rownames(a), a), 'a.txt', row.names=FALSE)

Prost, yannick

80
Yannick Wurm

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

Standardmäßig gibt es keinen Spaltennamen für eine Spalte mit Zeilennamen. Wenn col.names = NA und row.names = TRUE Es wird ein leerer Spaltenname hinzugefügt. Diese Konvention wird für CSV-Dateien verwendet, die von Tabellenkalkulationen gelesen werden.

Also musst du tun

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

und du bekommst

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

Eine geringfügige Änderung an @Marek, die sehr hilfreich ist, fügt der Spalte "rownames" eine Überschrift hinzu: Fügen Sie die rownames vorübergehend als erste Spalte im data.frame hinzu und schreiben Sie diese, wobei Sie 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 du bekommst

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

Für alle, die mit tidyverse (dplyr usw.) arbeiten, kann die rownames_to_column() -Funktion aus dem tibble -Paket verwendet werden, um auf einfache Weise Zeilennamen in zu konvertieren eine Spalte, 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

Wenn Sie dies mit der Option row.names=FALSE In write.table() kombinieren, erhalten Sie eine Ausgabe mit Überschriften für alle Spalten.

3
Keith Hughitt

Für diejenigen, die das gleiche Problem beim Speichern einer Matrix mit write.table() haben und die row.names-Spalte beibehalten möchten, gibt es eine äußerst einfache Lösung:

 write.table(matrix,file="file.csv",quote=F,sep=";", row.names=T
             col.names=c("row_name_col;val1_col","val2_col"))

Auf diese Weise betrügen Sie im Grunde die write.table, um eine Kopfzeile für die Spalte row.names zu erstellen. Die resultierende CSV-Datei würde folgendermaßen aussehen:

row_name_col;val1_col;val2_col
row1;1;4 
row2;2;5 
row3;3;6 
1
Landry BETE

Ich habe eine einfache Funktion von @mnel überarbeitet, die durch die Verwendung von Verbindungen mehr Flexibilität bietet. 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 können die Funktion als 'write.table', 'write.csv', 'write.delim' usw. angeben.

Prost!

0
yuanhangliu1