【问题标题】:Get labels of distance matrix cell获取距离矩阵单元的标签
【发布时间】:2015-05-22 04:21:12
【问题描述】:

数据:

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

>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")

【问题讨论】:

  • 我编辑了我的 dput(),感谢 cmets。该矩阵是函数 dist() 的输出(欧式距离)。
  • 另外,names(which(as.matrix(mat) == min(mat), arr.ind = TRUE)[, 1])

标签: r matrix


【解决方案1】:

边距名称存储在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 属性中。

【讨论】:

  • 就像一个魅力,虽然代码真的很混乱。 :) 谢谢
  • @Frank 为什么which(mat == min(mat)) 给出与which(mat == min(mat), arr.ind=T) 相同的结果?
  • 啊,我现在看到你的回答/评论了 :) 我认为这会是一个很好的答案。
  • 它和你的很相似,所以你也可以添加它。
  • @DavidArenburg 添加。随意改进解释或进行其他更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
  • 2011-08-08
相关资源
最近更新 更多