2012-03-29 10 views
14

तो मान लें कि मेरे पास एक मैट्रिक्स है, एमडीएटी और मुझे केवल इंडेक्स नंबर पता है। मैं कॉलम और पंक्ति नाम कैसे प्राप्त करूं?मैट्रिक्स इंडेक्स वैल्यू द्वारा मैट्रिक्स कॉलम और पंक्ति नाम कैसे प्राप्त करूं?

> mdat <- matrix(c(1,2,3, 11,12,13), nrow = 2, ncol=3, byrow=TRUE, 
    dimnames = list(c("row1", "row2"), c("C.1", "C.2", "C.3"))) 
> mdat[4] 
[1] 12 
> names(mdat[4]) 
NULL 
> colnames(mdat[4]) 
NULL 
> rownames(mdat[4]) 
NULL 
> dimnames(mdat[4]) 
NULL 

उत्तर

21

सबसे पहले आप पंक्ति और कहा कि सूचकांक arrayInd का उपयोग करने का स्तंभ प्राप्त करने की आवश्यकता। इस जवाब फिर से पढ़ने में

mapply(`[[`, dimnames(mdat), k) 
+4

,:

k <- arrayInd(4, dim(mdat)) 

फिर आप सही नाम पंक्ति और स्तंभ नाम

rownames(mdat)[k[,1]] colnames(mdat)[k[,2]] 

या दोनों की उस तत्व हो रही द्वारा एक बार mapply का उपयोग करने में प्राप्त कर सकते हैं मुझे आश्चर्य है कि ओपी में केवल समग्र इंडेक्स था क्योंकि वे 'arr.ind = TRUE' के बिना 'कौन' चलाते थे। भविष्य पाठक: यदि आप 'index' से उस अनुक्रमणिका को प्राप्त कर रहे हैं, तो 'arrayInd' का उपयोग करने के बजाय, पंक्ति और कॉलम इंडेक्स प्राप्त करने के लिए' arr.ind = TRUE' का उपयोग करें। – Aaron

6

एक एक तत्व वेक्टर कोई नाम नहीं है, जैसा कि आप अपने प्रश्न में दिखाने में मैट्रिक्स पहला परिणाम subsetting: उदाहरण के लिए। याद रखें कि सबसेटिंग प्रतिलिपि के माध्यम से एक पूरी तरह से नई वस्तु बनाता है। सबसेटिंग के बाद मूल mdat का संदर्भ देने का कोई तरीका नहीं है।

यदि आप किसी अन्य ऑब्जेक्ट को सबसेट करने का परिणाम असाइन करते हैं तो यह अधिक स्पष्ट है।

> m <- mdat[4] 
> m 
[1] 12 
> names(m) # no names were printed above... so 
NULL 

आप वास्तव में पहले स्तंभ/पंक्ति के नाम का उपयोग और उन्हें सबसेट को चाहते हैं।

> colnames(mdat)[3] 
[1] "C.3" 
> rownames(mdat)[2] 
[1] "row2" 

आप कॉलम/पंक्ति नामों को समान रूप से फिर से असाइन कर सकते हैं।

> colnames(mdat)[3] <- "C3" 
> rownames(mdat)[2] <- "row.2" 
> mdat 
     C.1 C.2 C3 
row1 1 2 3 
row.2 11 12 13