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

时间:2015-05-21 14:22:01

标签: 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

问题:

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

预期输出类似于:

[1] 336 249

我尝试使用colnames(mat)rownames(mat),但都返回NULL

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

[1] "179" "175" "176" "181" "249" "336"

但是在这里我被困住了,无法绕过它。它可能很容易,提前抱歉提出这个简单的问题。 关于如何做到这一点的任何想法?

我的数据使用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")

1 个答案:

答案 0 :(得分:4)

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

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

@ DavidArenburg的替代

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