जब rownames है हेडर के लिए अवांछित प्रमुख खाली कॉलम लिखना


91

इस उदाहरण की जाँच करें:

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

चीयर्स, यानिक

जवाबों:


140

हवाला देते हुए ?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

4
@Marek, क्या यह संभव होगा कि नाम को पंक्ति के कॉलम में जोड़ा जाए? यानी, "" के बजाय, "आईडी" या कुछ समान जोड़ें?
दनाईल

2
@Dnaiel जो मुझे पता है उससे आप नहीं कर सकते। आप डेटा के साथ पंक्ति नामों को बांध सकते हैं और उन्हें नाम दे सकते हैं (जैसे प्रश्न में)।
मारेक

1
@rusalkaguy आपके संपादन का कोई मतलब नहीं है। यह "विस्तार" मूल प्रश्न ("वर्कअराउंड" के अलावा) में है
मारेक

आप प्रत्येक स्तंभ में कॉल को नाम के तहत लाइन अप करने के लिए कैसे प्राप्त करेंगे?
आरआरएस

@ आप निश्चित चौड़ाई प्रारूप का मतलब है? को देखो GData पैकेज से write.fwf । और टिप्पणी के बजाय नया प्रश्न पूछें। और आपको कभी इसकी आवश्यकता क्यों है ?!
मारेक

10

@Marek के लिए एक मामूली संशोधन बहुत मददगार जवाब होगा पंक्तिलेख स्तंभ में एक शीर्ष लेख जोड़ें: अस्थायी रूप से डेटा नाम में पहले स्तंभ के रूप में पंक्ति नाम जोड़ सकते हैं, और यह लिखकर कि वास्तविक पंक्ति नामों की अनदेखी कर रहे हैं।

> 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

मुझे लगता है कि इसे शामिल करने के लिए मिर्क के उत्तर को संपादित करना चाहिए।
user8397947

3

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


1

उन लोगों के लिए जो मैट्रिक्स के साथ बचत करते समय एक ही समस्या का अनुभव करते हैं 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से पंक्ति के लिए हेडर लेबल बनाने के लिए फ़ंक्शन को ट्रिक कर रहे हैं। नाम कॉलम। परिणामी .csv फ़ाइल इस तरह दिखाई देगी:

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

मैं col.names = c ("row_name", colnames (मैट्रिक्स)) आज़मा रहा हूँ और अमान्य 'col.names' स्पेसिफिकेशन कहकर एक त्रुटि प्राप्त करता हूँ। कुछ पता है क्या गड़बड़ है? c ("row_name", colnames (मैट्रिक्स)) सही पाठ देता है।
माइकलई

write.tableलंबाई के एक हेडर की उम्मीद है ncol(matrix)और आप इसे एक और दे रहे हैं। मैं ऊपर समाधान करने की कोशिश की, यह काम नहीं, सबसे अच्छा अन्य समाधान में की तरह एक स्तंभ के रूप में rownames स्थानांतरित करने के लिए है है
ऑरेलीन

0

मैंने @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,...)
}

आप फ़ंक्शन को 'write.table', 'write.csv', 'write.delim' आदि के रूप में निर्दिष्ट कर सकते हैं।

चीयर्स!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.