【问题标题】:Find indices of 5 closest samples in distance matrix在距离矩阵中查找 5 个最近样本的索引
【发布时间】:2013-01-16 10:09:58
【问题描述】:

用户

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

代码:

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

第 3 行代码找到离第一个样本最近的样本的索引。

感谢您的帮助!

最好, 切加

【问题讨论】:

    标签: r matrix distance


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的快速回复!请允许我问一个问题:我确实理解“顺序”和“头部”,但最后一个术语“+1”的目的是什么?
    【解决方案2】:

    替代使用sort:

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

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

    编辑(正确的解决方案):上述解决方案只有在第一个元素总是最小的情况下才有效!下面是正确的解决方案,它总是为列的第一个元素提供 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)
    

    【讨论】:

    • 感谢 - 也感谢 set.seed() 的提示 - 绝对有意义!
    • 一般情况的另一种选择是返回 n+1 个最接近的索引并删除第一个,即head(order(dMat[,1]),6)[-1]
    • @Arun 啊,是的,这仅在您想要引用元素 n 的列 n 时才有效。但这就是距离矩阵的返回值。
    猜你喜欢
    • 2017-10-05
    • 2014-01-25
    • 2014-06-20
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多