我有一個距離矩陣DMAT,想找到最近的5個樣本的第一個。我可以在R中使用哪些功能?我知道如何找到最接近的樣本(參見第3行代碼),但無法弄清楚如何獲得其他4個樣本。
的代碼:
Mat <- replicate(10, rnorm(10))
dMat <- as.matrix(dist(Mat))
which(dMat[,1]==min(dMat[,1]))
的代碼的第三行查找最接近的樣品與第一樣本的索引。
感謝您的幫助!
最佳, Chega
我有一個距離矩陣DMAT,想找到最近的5個樣本的第一個。我可以在R中使用哪些功能?我知道如何找到最接近的樣本(參見第3行代碼),但無法弄清楚如何獲得其他4個樣本。
的代碼:
Mat <- replicate(10, rnorm(10))
dMat <- as.matrix(dist(Mat))
which(dMat[,1]==min(dMat[,1]))
的代碼的第三行查找最接近的樣品與第一樣本的索引。
感謝您的幫助!
最佳, Chega
您可以使用order
做到這一點:
head(order(dMat[-1,1]),5)+1
[1] 10 3 4 8 6
注意,我刪除了第一個,因爲你可能不希望包括事實,你的參考點距離本身0距離。
替代使用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)
感謝這個快速反應!請允許我提出一個問題:我確實理解「訂單」和「頭」,但最後一期「+1」的目的是什麼? – Chega
好吧,我明白了,非常感謝! – Chega