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.