2013-01-16 9 views
8

ユーザ距離行列の5つの最も近いサンプルのインデックスを見つける

私は距離行列dMatを持ち、最初のものに5つの最も近いサンプルを探したいと思う。 Rでどのような機能を使用できますか?私は最も近いサンプルを見つける方法を知っています(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の距離です。 sortを使用して

+0

ありがとう!私には1つの質問を許可します:私は "順序"と "頭"を理解しますが、最後の用語 "+1"の目的は何ですか? – Chega

+0

申し訳ありません、私はそれを、多くのありがとう! – Chega

5

オルタナティブ:

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

関連する問題