2013-01-16 74 views
8

用戶找到最接近5個樣本指數在距離矩陣

我有一個距離矩陣DMAT,想找到最近的5個樣本的第一個。我可以在R中使用哪些功能?我知道如何找到最接近的樣本(參見第3行代碼),但無法弄清楚如何獲得其他4個樣本。

的代碼:

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

的代碼的第三行查找最接近的樣品與第一樣本的索引。

感謝您的幫助!

最佳, 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

一般情況下的另一種選擇是返回n + 1最接近的索引並刪除第一個,即'head(order(dMat [,1]),6)[ - 1]' – James

+1

@Arun啊是的,這隻會如果你想要引用元素n的列n,則工作。但這是距離矩陣會返回的內容。 – James