数据:
我有距离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")
最佳答案
边距名称存储在 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
属性。 关于r - 获取距离矩阵单元格的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30376553/