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

Che*_*ega 9 r distance matrix

用户

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

代码:

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

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

谢谢你的帮助!

最好的,Chega

Jam*_*mes 7

你可以order这样做:

head(order(dMat[-1,1]),5)+1
[1] 10  3  4  8  6
Run Code Online (Sandbox Code Playgroud)

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


Aru*_*run 5

替代使用sort:

sort(dMat[,1], index.return = TRUE)$ix[1:6]
Run Code Online (Sandbox Code Playgroud)

在矩阵中set.seed(.)使用时添加一个是很好的,random numbers这样我们就可以显示结果是相同的.我将在此处跳过结果.

编辑(正确的解决方案):上述解决方案仅在第一个元素始终最小时才有效!这是正确的解决方案,它将始终为列的第一个元素提供5个最接近的值:

> sort(abs(dMat[-1,1] - dMat[1,1]), index.return=TRUE)$ix[1:5] + 1
Run Code Online (Sandbox Code Playgroud)

例:

> 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)
Run Code Online (Sandbox Code Playgroud)