2013-01-16 11 views
8

उपयोगकर्तादूरी मैट्रिक्स में

मैं एक दूरी मैट्रिक्स dMat है और पहले एक करने के लिए 5 निकटतम नमूने लगाना चाहते हैं 5 निकटतम नमूनों की सूचकांकों का पता लगाएं। आर में मैं किस फ़ंक्शन का उपयोग कर सकता हूं? मुझे पता है कि निकटतम नमूना (कोड की सीएफ 3 सीधी रेखा) कैसे ढूंढें, लेकिन यह पता नहीं लगा सकता कि अन्य 4 नमूने कैसे प्राप्त करें।

कोड:

Mat <- replicate(10, rnorm(10)) 
dMat <- as.matrix(dist(Mat)) 
which(dMat[,1]==min(dMat[,1])) 

कोड के 3 लाइन पहला नमूना के सबसे करीब नमूना के सूचकांक पाता है।

किसी भी मदद के लिए धन्यवाद!

बेस्ट, Chega

उत्तर

6

आप order उपयोग कर सकते हैं यह करने के लिए:

head(order(dMat[-1,1]),5)+1 
[1] 10 3 4 8 6 

ध्यान दें कि मैं पहली बार एक को हटा, जैसा कि आप शायद इस तथ्य शामिल करने के लिए नहीं करना चाहते हैं कि आपके संदर्भ बिंदु खुद से 0 दूरी दूर है।

+0

इस त्वरित प्रतिक्रिया के लिए धन्यवाद! मुझे एक प्रश्न की अनुमति दें: मैं "आदेश" और "सिर" को समझता हूं, लेकिन अंतिम शब्द "+1" का उद्देश्य क्या है? – Chega

+0

ठीक है, मुझे मिल गया, इसके लिए बहुत धन्यवाद! – Chega

5

sort का उपयोग कर वैकल्पिक:

sort(dMat[,1], index.return = TRUE)$ix[1:6] 

यह जब मैट्रिक्स में random numbers का उपयोग कर ताकि हम दिखा सकता है परिणाम समान हैं एक set.seed(.) जोड़ने के लिए अच्छा होगा। मैं यहां परिणाम छोड़ दूंगा।

संपादित करें (सही समाधान): ऊपर समाधान केवल तभी पहला तत्व हमेशा होता है छोटी से छोटी काम करेंगे! यहाँ सही समाधान है कि हमेशा स्तंभ के पहले तत्व के लिए 5 सबसे करीब मूल्यों दे देंगे है:

> sort(abs(dMat[-1,1] - dMat[1,1]), index.return=TRUE)$ix[1:5] + 1 

उदाहरण:

> dMat <- matrix(c(70,4,2,1,6,80,90,100,3), ncol=1) 
# James' solution 
> head(order(dMat[-1,1]),5) + 1 
[1] 4 3 9 2 5 # values are 1,2,3,4,6 (wrong) 
# old sort solution 
> sort(dMat[,1], index.return = TRUE)$ix[1:6] 
[1] 4 3 9 2 5 1 # values are 1,2,3,4,6,70 (wrong) 
# Correct solution 
> sort(abs(dMat[-1,1] - dMat[1,1]), index.return=TRUE)$ix[1:5] + 1 
[1] 6 7 8 5 2 # values are 80,90,100,6,4 (right) 
+0

धन्यवाद - set.seed() के साथ संकेत के लिए भी - बिल्कुल समझ में आता है! – Chega

+0

सामान्य मामले के लिए एक और विकल्प एन + 1 निकटतम सूचकांक वापस करना है और पहले, यानी 'सिर (ऑर्डर (डीएमएटी [, 1]), 6) [- 1] ' – James

+1

@ अरुण आह हां, यह केवल तभी होगा अगर कॉलम एन के लिए आप तत्व एन को संदर्भित करना चाहते हैं तो काम करें। लेकिन यह दूरी मैट्रिक्स वापस आ जाएगा। – James

संबंधित मुद्दे