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(.)在矩阵中使用时添加一个会很好,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 回答