R 获取距离矩阵单元的标签
数据: 我有一个称为mat的距离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
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)
作为其标签
。这些名称作为.matrix(mat)=min(mat)保留在dimnames
的结果中,其中(…,arr.ind=TRUE)
- 因为距离矩阵是对称的,当
时,我们有两个极小值(假设一对唯一的极小值点)。我们可以通过选择列位置来选择这对点,d(a,b)==d(b,a)
,它再次保持[,1]
的原始mat
,但现在处于其标签
属性中名称
名称(如.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])