में पंक्ति नाम और कॉलम नाम निम्नलिखित फ़ंक्शन जोड़े बिल्कुल वही परिणाम उत्पन्न करते हैं?आर
जोड़ी 1) names()
& colnames()
जोड़ी 2) rownames()
& row.names()
में पंक्ति नाम और कॉलम नाम निम्नलिखित फ़ंक्शन जोड़े बिल्कुल वही परिणाम उत्पन्न करते हैं?आर
जोड़ी 1) names()
& colnames()
जोड़ी 2) rownames()
& row.names()
ऑस्कर वाइल्ड के रूप में कहा
संगति ख़याल से बाहर की अंतिम शरण है।
आर डिज़ाइन की गई भाषा के बजाय विकसित हुआ है, इसलिए ये चीजें होती हैं।
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>
बस एक प्रकार की कटार के उदाहरण पर एक छोटे से विस्तार करने के लिए: 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
यह एक बेहतर उत्तर है। स्नर्क मजाकिया है, लेकिन ज्ञान अधिक उपयोगी है। एक 'data.frame' वास्तव में स्तंभों और मैट्रिक्स की सूची दोनों के रूप में प्रयोग योग्य है, यानी प्रत्येक कॉलम की लंबाई समान है और आप पंक्तियों की एकल पंक्तियों या उप-समूह निकाल सकते हैं। –
मुझे लगता है कि लगता है colnames
और rownames
का उपयोग करके सबसे अधिक समझदारी होती है; यहाँ पर क्यों।
names
का उपयोग कई नुकसान हैं। आपको याद रखना होगा कि इसका मतलब है "कॉलम नाम", और यह केवल डेटा फ्रेम के साथ काम करता है, इसलिए जब भी आप मैट्रिक्स का उपयोग करते हैं तो आपको colnames
पर कॉल करने की आवश्यकता होगी। colnames
पर कॉल करके, आपको केवल एक फ़ंक्शन याद रखना होगा। अंत में, यदि आप colnames
के लिए कोड देखते हैं, तो आप देखेंगे कि यह डेटा फ्रेम के मामले में names
पर कॉल करता है, इसलिए आउटपुट समान है।
rownames
और row.names
डेटा फ्रेम और मैट्रिस के लिए समान मूल्य लौटाएं; मैंने जो एकमात्र अंतर देखा है वह यह है कि जहां कोई नाम नहीं है, rownames
"NULL" प्रिंट करेगा (जैसा कि colnames
करता है), लेकिन row.names
इसे अदृश्य रूप से लौटाता है। चूंकि दो कार्यों के बीच चयन करने के लिए बहुत कुछ नहीं है, rownames
सौंदर्यशास्त्र के आधार पर जीतता है, क्योंकि यह colnames
के साथ अधिक सुंदरता से जोड़ता है। (इसके अलावा, आलसी प्रोग्रामर के लिए, आप टाइपिंग के एक चरित्र को बचाते हैं।)
और एक और विस्तार:
# 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()
के साथ रहना चाहिए।
तो वहां ...
उदाहरण के साथ उत्तर के लिए धन्यवाद। तो क्या इसका मतलब यह है कि 'नाम()' के बजाय 'उपनाम() 'का उपयोग करना हमेशा सुविधाजनक होता है? पंक्ति नामों के लिए एक समान स्थिति है? –
डेटा प्रकारों के बीच अंतर हैं। – Jay
एमर्सन ने कहा: "एक मूर्खतापूर्ण स्थिरता छोटे दिमागों का शौक है, जो छोटे राजनेताओं और दार्शनिकों और divines द्वारा adored। निरंतरता के साथ एक महान आत्मा के पास कुछ भी करने के लिए कुछ भी नहीं है।" –