在距离矩阵中查找5个最接近样本的索引

时间:2013-01-16 10:09:59

标签: r matrix distance

用户

我有一个距离矩阵dMat,想要找到距离第一个最近的5个样本。我可以在R中使用什么功能?我知道如何找到最接近的样本(参见第3行代码),但无法弄清楚如何获得其他4个样本。

代码:

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

第3行代码查找与第一个样本最接近的样本的索引。

感谢您的帮助!

最佳, Chega

2 个答案:

答案 0 :(得分:7)

您可以使用order执行此操作:

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

请注意,我删除了第一个,因为您可能不希望包含您的参考点与其自身距离为0的事实。

答案 1 :(得分:5)

替代使用sort

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

在矩阵中使用set.seed(.)时添加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)