write.table, satır adları olduğunda istenmeyen boş sütunu başlığa yazar


92

bu örneğe bakın:

> 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

tablo doğru görüntüleniyor. Dosyaya yazmanın iki farklı yolu vardır ...

write.csv(a, 'a.csv') beklendiği gibi veren:

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

ve write.table(a, 'a.txt')hangisini mahvediyor

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

aslında, boş bir sekme eksik ... Bu, aşağı akış şeyler için popoda bir acı. Bu bir hata veya özellik mi? Bir çözüm var mı? (dışında write.table(cbind(rownames(a), a), 'a.txt', row.names=FALSE)

Şerefe yannick

Yanıtlar:


141

Alıntı ?write.table, bölüm CSV dosyaları :

Varsayılan olarak, satır adlarından oluşan bir sütun için sütun adı yoktur. Eğer col.names = NAve row.names = TRUEboş sütun adı elektronik tablolar tarafından okunacak CSV dosyaları için kullanılan kongre olan eklenir.

Yani yapmalısın

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

ve sen alırsın

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

4
@Marek, rownames sütununa bir isim eklemek mümkün müdür? Yani, "" yerine "kimlik" veya benzeri bir şey mi ekleyeceksiniz?
Dnaiel

2
@Dnaiel Yapamayacağını bildiğim kadarıyla. Satır adlarını verilerle bağlayabilir ve onlara adlar verebilirsiniz (söz konusu olduğu gibi).
Marek

1
@rusalkaguy Düzenlemenizin bir anlamı yok. Bu "uzantı" orijinal soruda ("dışında geçici çözüm")
Marek

Her sütundaki sayının sütun adlarının altında sıralanmasını nasıl sağlarsınız?
2017

@rrs Sabit genişlik biçimini mi kastediyorsunuz? Bak gveri paketinden write.fwf . Ve yorum yapmak yerine yeni bir soru sorun. Ve neden buna ihtiyacın var ?!
Marek

10

@Marek'e yapılan ufak bir değişiklik çok yararlı cevapta Rownames sütununa bir başlık ekleyecektir: geçici olarak satır adlarını data.frame'deki ilk sütun olarak ekleyin ve gerçek satır adlarını yok sayarak bunu yazın.

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

ve sen alırsın

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

Bence bunu eklemek için Marek'in cevabını düzenlemelisiniz.
user8397947

3

Herkes çalışma için tidyverse (dplyr, vs.) rownames_to_column()ile ilgili fonksiyon Tibble paketin kolayca bir sütun, örn row.names dönüştürmek için kullanılabilir:

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

Bunu row.names=FALSEseçenekle birleştirmek write.table(), tüm sütunlar için başlık adlarıyla çıktı elde edilmesini sağlar.


1

Bir matrisi kaydederken aynı sorunu write.table()yaşayanlar ve row.names sütununu tutmak isteyenler için, aslında son derece basit bir çözüm var:

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

Bunu yaparak, temelde write.tableişlevi, row.names sütunu için bir başlık etiketi oluşturması için kandırmış olursunuz. Ortaya çıkan .csv dosyası şöyle görünecektir:

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

Col.names = c ("row_name", colnames (matrix)) deniyorum ve geçersiz 'col.names' belirtimini söyleyen bir hata alıyorum. Neyin yanlış olduğuyla ilgili bir fikriniz var mı? c ("satır_adı", sütun adları (matris)) doğru metni verir.
Michael,

write.tableuzunlukta bir başlık bekliyorsunuz ncol(matrix)ve bir tane daha veriyorsunuz. Yukarıdaki çözümü denedim, işe yaramıyor, en iyisi diğer çözümlerde olduğu gibi alt adları bir sütun olarak taşımak
aurelien

0

@ Mnel'den, bağlantıları kullanarak esneklik sağlayan basit bir işlevi revize ettim. İşte fonksiyon:

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

İşlevi 'write.table', 'write.csv', 'write.delim' vb. Olarak belirtebilirsiniz.

Şerefe!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.