आर

2010-02-17 44 views
43

में पंक्ति नाम और कॉलम नाम निम्नलिखित फ़ंक्शन जोड़े बिल्कुल वही परिणाम उत्पन्न करते हैं?आर

जोड़ी 1) names() & colnames()

जोड़ी 2) rownames() & row.names()

उत्तर

56

ऑस्कर वाइल्ड के रूप में कहा

संगति ख़याल से बाहर की अंतिम शरण है।

आर डिज़ाइन की गई भाषा के बजाय विकसित हुआ है, इसलिए ये चीजें होती हैं।

R> DF <- data.frame(foo=1:3, bar=LETTERS[1:3]) 
R> names(DF) 
[1] "foo" "bar" 
R> colnames(DF) 
[1] "foo" "bar" 
R> M <- matrix(1:9, ncol=3, dimnames=list(1:3, c("alpha","beta","gamma"))) 
R> names(M) 
NULL 
R> colnames(M) 
[1] "alpha" "beta" "gamma" 
R> 
+0

उदाहरण के साथ उत्तर के लिए धन्यवाद। तो क्या इसका मतलब यह है कि 'नाम()' के बजाय 'उपनाम() 'का उपयोग करना हमेशा सुविधाजनक होता है? पंक्ति नामों के लिए एक समान स्थिति है? –

+2

डेटा प्रकारों के बीच अंतर हैं। – Jay

+5

एमर्सन ने कहा: "एक मूर्खतापूर्ण स्थिरता छोटे दिमागों का शौक है, जो छोटे राजनेताओं और दार्शनिकों और divines द्वारा adored। निरंतरता के साथ एक महान आत्मा के पास कुछ भी करने के लिए कुछ भी नहीं है।" –

8

बस एक प्रकार की कटार के उदाहरण पर एक छोटे से विस्तार करने के लिए: names() और एक data.frame लेकिन names() पर colnames() काम एक मैट्रिक्स पर काम नहीं करता

यह बराबर लंबाई के साथ एक सूची के रूप में एक डेटा फ्रेम के बारे में सोच में मदद करता है वैक्टर। शायद यही कारण है कि names डेटा फ्रेम के साथ काम करता है लेकिन मैट्रिक्स नहीं।

अन्य उपयोगी फ़ंक्शन dimnames है जो प्रत्येक आयाम के लिए नाम देता है। आप देखेंगे कि rownames फ़ंक्शन वास्तव में केवल dimnames से पहला तत्व लौटाता है।

rownames और row.names के बारे में: मैं, अंतर नहीं बता सकता, हालांकि rownames का उपयोग करता dimnames जबकि row.names आर के बाहर लिखा गया था वे दोनों भी उच्च आयामी सरणियों के साथ काम करने के लिए लग रहे हैं:

>a <- array(1:5, 1:4) 
> a[1,,,] 
> rownames(a) <- "a" 
> row.names(a) 
[1] "a" 
> a 
, , 1, 1  
    [,1] [,2] 
a 1 2 

> dimnames(a) 
[[1]] 
[1] "a" 

[[2]] 
NULL 

[[3]] 
NULL 

[[4]] 
NULL 
+1

यह एक बेहतर उत्तर है। स्नर्क मजाकिया है, लेकिन ज्ञान अधिक उपयोगी है। एक 'data.frame' वास्तव में स्तंभों और मैट्रिक्स की सूची दोनों के रूप में प्रयोग योग्य है, यानी प्रत्येक कॉलम की लंबाई समान है और आप पंक्तियों की एकल पंक्तियों या उप-समूह निकाल सकते हैं। –

5

मुझे लगता है कि लगता है colnames और rownames का उपयोग करके सबसे अधिक समझदारी होती है; यहाँ पर क्यों।

names का उपयोग कई नुकसान हैं। आपको याद रखना होगा कि इसका मतलब है "कॉलम नाम", और यह केवल डेटा फ्रेम के साथ काम करता है, इसलिए जब भी आप मैट्रिक्स का उपयोग करते हैं तो आपको colnames पर कॉल करने की आवश्यकता होगी। colnames पर कॉल करके, आपको केवल एक फ़ंक्शन याद रखना होगा। अंत में, यदि आप colnames के लिए कोड देखते हैं, तो आप देखेंगे कि यह डेटा फ्रेम के मामले में names पर कॉल करता है, इसलिए आउटपुट समान है।

rownames और row.names डेटा फ्रेम और मैट्रिस के लिए समान मूल्य लौटाएं; मैंने जो एकमात्र अंतर देखा है वह यह है कि जहां कोई नाम नहीं है, rownames "NULL" प्रिंट करेगा (जैसा कि colnames करता है), लेकिन row.names इसे अदृश्य रूप से लौटाता है। चूंकि दो कार्यों के बीच चयन करने के लिए बहुत कुछ नहीं है, rownames सौंदर्यशास्त्र के आधार पर जीतता है, क्योंकि यह colnames के साथ अधिक सुंदरता से जोड़ता है। (इसके अलावा, आलसी प्रोग्रामर के लिए, आप टाइपिंग के एक चरित्र को बचाते हैं।)

2

और एक और विस्तार:

# create dummy matrix 
set.seed(10) 
m <- matrix(round(runif(25, 1, 5)), 5) 
d <- as.data.frame(m) 

आप नए स्तंभ नाम आप data.frame पर निम्न कर सकते हैं प्रदान करना चाहते हैं:

# an identical effect can be achieved with colnames() 
names(d) <- LETTERS[1:5] 
> d 
    A B C D E 
1 3 2 4 3 4 
2 2 2 3 1 3 
3 3 2 1 2 4 
4 4 3 3 3 2 
5 1 3 2 4 3 

आप, तथापि matrix पर पिछले आदेश चला, तो आप ' गड़बड़ चीजें ऊपर:

names(m) <- LETTERS[1:5] 
> m 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 3 2 4 3 4 
[2,] 2 2 3 1 3 
[3,] 3 2 1 2 4 
[4,] 4 3 3 3 2 
[5,] 1 3 2 4 3 
attr(,"names") 
[1] "A" "B" "C" "D" "E" NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
[20] NA NA NA NA NA NA 

चूंकि मैट्रिक्स बी ई को द्वि-आयामी वेक्टर के रूप में माना जाता है, आप केवल पहले पांच मानों के नाम निर्दिष्ट करेंगे (आप ऐसा नहीं करना चाहते हैं, क्या आप?)। इस मामले में, आपको colnames() के साथ रहना चाहिए।

तो वहां ...