数据:
我的距离为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")
答案 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
属性。