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

R 获取距离矩阵单元的标签,r,matrix,R,Matrix,数据: 我有一个称为mat的距离矩阵,具有以下标签和值: >mat 179 175 176 181 249 175 147.451648 176 174.527392 28.849183 181 187.166092 40.007553 16.310747

数据:

我有一个称为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
问题:

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

预期输出类似于:

[1] 336 249
我尝试使用
colnames(mat)
rownames(mat)
,但两者都返回
NULL

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

[1] "179" "175" "176" "181" "249" "336"
但是在这里我被卡住了,我的头也绕不过去。这可能是件容易的事,事先抱歉问了这个简单的问题。 有什么办法吗

这里是使用
dput()
的我的数据:


边距名称存储在
标签(mat)
中,您可以在
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")
labels(mat)[which(lower.tri(mat),arr.ind=TRUE)[which.min(mat),]]
# [1] 336 249
  • 在距离矩阵中,两个边距相同,因此使用
    标签
    而不是
    dimnames
  • 哪个.min
    给出最小值的向量位置。然而,
    mat
    是一个矩阵,所以
  • 其中(lower.tri(mat),arr.ind=TRUE)
    给出了矩阵和向量位置之间的链接

@戴维登堡替代方案

  • as.matrix(mat)
    采用
    标签
    作为其
    dimnames
    。这些名称作为.matrix(mat)=min(mat)保留在
    的结果中,其中(…,arr.ind=TRUE)
  • 因为距离矩阵是对称的,当
    d(a,b)==d(b,a)
    时,我们有两个极小值(假设一对唯一的极小值点)。我们可以通过选择列位置来选择这对点,
    [,1]
    ,它再次保持
    mat
    的原始
    标签
    ,但现在处于其
    名称
    属性中

我编辑了我的dput(),感谢您的评论。矩阵是dist()函数(欧几里德距离)的输出。此外,
名称(如.matrix(mat)=min(mat),arr.ind=TRUE)[,1])
工作起来像个符咒,尽管代码非常混乱。:)thanks@Frank为什么
which(mat==min(mat))
给出的结果与
which(mat==min(mat),arr.ind=T)
相同?啊,我现在看到了你的答案/评论:)我认为这是一个很好的答案。它与你的答案非常相似,因此如果你愿意,你也可以添加它。@davidernburg补充道。请随意改进解释或进行其他更改。
names(which(as.matrix(mat) == min(mat), arr.ind = TRUE)[, 1])