获取距离矩阵单元格的标签

maR*_*tin 4 r matrix

数据:

我有一个matrix名为mat的距离,具有以下标签和值:

>mat
           179        175        176        181        249
175 147.451648                                            
176 174.527392  28.849183                                 
181 187.166092  40.007553  16.310747                      
249 194.644103  49.268129  20.637011  17.118671           
336 190.182183  44.613076  16.023090  13.697248   5.613544
Run Code Online (Sandbox Code Playgroud)

问题:

我想为矩阵的最小值 (5.613544) 提取行和列标签。

预期的输出类似于:

[1] 336 249
Run Code Online (Sandbox Code Playgroud)

我尝试使用colnames(mat)andrownames(mat)但都返回NULL.

我知道该函数labels(mat)能够返回标签:

[1] "179" "175" "176" "181" "249" "336"
Run Code Online (Sandbox Code Playgroud)

但在这里我被卡住了,无法理解它。它可能很简单,提前抱歉问这个简单的问题。关于如何做到这一点的任何想法?

这里我的数据使用dput()

structure(c(147.451648169349, 174.527392333086, 187.166091923018, 
                194.644102830409, 190.182183344061, 28.849182654733, 40.007553207889, 
                49.2681293306533, 44.6130761331497, 16.3107466873124, 20.6370107209517, 
                16.0230895738958, 17.1186706020006, 13.6972482228087, 5.6135436361904
    ), Size = 6L, Labels = c("179", "175", "176", "181", "249", "336"
    ), Diag = FALSE, Upper = FALSE, method = "euclidean", class = "dist")
Run Code Online (Sandbox Code Playgroud)

Fra*_*ank 5

保证金名称存储在labels(mat)您可以在您的dput:

labels(mat)[which(lower.tri(mat),arr.ind=TRUE)[which.min(mat),]]
# [1] 336 249
Run Code Online (Sandbox Code Playgroud)
  • 在距离矩阵中,两个边距相同,因此 labels使用 代替dimnames
  • which.min给出最小值的向量位置。然而mat是一个矩阵,所以...
  • which(lower.tri(mat),arr.ind=TRUE) 给出矩阵和向量位置之间的联系。

@DavidArenburg 的替代方案

names(which(as.matrix(mat) == min(mat), arr.ind = TRUE)[, 1])
Run Code Online (Sandbox Code Playgroud)
  • as.matrix(mat)采用labels作为其dimnames. 这些名称结转as.matrix(mat) == min(mat)并保留在which(...,arr.ind=TRUE).
  • 因为距离矩阵是对称的,所以d(a,b)==d(b,a)我们有两个最小值(假设有一对唯一的最小化点)。我们可以通过获取列的位置来选择这对点[,1],它再次保持mat原始的labels,但现在保留在它的names属性中。

  • 啊,我现在看到你的回答/评论:) 我认为这会是一个很好的答案。 (2认同)
  • @DavidArenburg 添加。随意改进解释或进行其他更改。 (2认同)