الكتابة. يكتب العمود الفارغ غير المرغوب فيه إلى رأسه عندما يكون روكيس

StackOverflow https://stackoverflow.com/questions/2478352

  •  21-09-2019
  •  | 
  •  

سؤال

تحقق من هذا المثال:

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

هتافات ، يانيك

هل كانت مفيدة؟

المحلول

نقلا عن ?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

نصائح أخرى

سيؤدي تعديل طفيف إلى marek الإجابة المفيدة للغاية إلى إضافة رأس إلى عمود Rownames: إضافة مؤقتًا الأسماء المتروّل كعمود أول في البيانات.

> 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

لأي شخص يعمل في ترتيب (dplyr ، وما إلى ذلك) ، rownames_to_column() وظيفة من القامة يمكن استخدام الحزمة لتحويل الصف. أسماء بسهولة إلى عمود ، على سبيل المثال:

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() النتائج في الإخراج مع أسماء الرأس لجميع الأعمدة.

بالنسبة لأولئك الذين يواجهون نفس المشكلة عند حفظ المصفوفة مع write.table() وترغب في الاحتفاظ بعمود الصف. أسماء ، هناك في الواقع حل بسيط للغاية:

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

من خلال القيام بذلك ، فأنت تخدع بشكل أساسي write.table العمل في إنشاء تسمية رأس لعمود ROW.NAME. سيبدو ملف .csv الناتج هكذا:

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

لقد قمت بمراجعة وظيفة بسيطة من 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,...)
}

يمكنك تحديد الوظيفة المراد "كتابة.

هتافات!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top