用户
我有一个距离矩阵dMat,想要找到距离第一个最近的5个样本。我可以在R中使用什么功能?我知道如何找到最接近的样本(参见第3行代码),但无法弄清楚如何获得其他4个样本。
代码:
Mat <- replicate(10, rnorm(10))
dMat <- as.matrix(dist(Mat))
which(dMat[,1]==min(dMat[,1]))
第3行代码查找与第一个样本最接近的样本的索引。
感谢您的帮助!
最佳, Chega
答案 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)