9

ユーザー

距離行列 dMat があり、最初のサンプルに最も近い 5 つのサンプルを見つけたいと考えています。R で使用できる関数は何ですか? 最も近いサンプルを見つける方法は知っていますが (コードの 3 行目を参照)、他の 4 つのサンプルを取得する方法がわかりません。

コード:

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

コードの 3 行目は、最初のサンプルに最も近いサンプルのインデックスを見つけます。

助けてくれてありがとう!

ベスト、チェガ

4

2 に答える 2

8

これを行うために使用できますorder

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

おそらく、参照ポイントがそれ自体から 0 の距離にあるという事実を含めたくないので、最初のものを削除したことに注意してください。

于 2013-01-16T10:26:31.553 に答える
5

代替使用sort

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

結果が同じであることを示すことができるように、行列でset.seed(.)使用するときに a を追加するとよいでしょう。random numbersここでは結果をスキップします。

編集 (正しい解決策):上記の解決策は、最初の要素が常に最小の場合にのみ機能します! 列の最初の要素に常に 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)
于 2013-01-16T10:46:27.973 に答える