用户
我有一个距离矩阵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
你可以order这样做:
head(order(dMat[-1,1]),5)+1
[1] 10 3 4 8 6
Run Code Online (Sandbox Code Playgroud)
请注意,我删除了第一个,因为您可能不希望包含您的参考点与其自身距离为0的事实.
替代使用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)