我有一个矩阵m
m <- matrix (
c( 2, 1, 8, 5,
7, 6, 3, 4,
9, 3, 2, 8,
1, 3, 7, 4),
nrow = 4,
ncol = 4,
byrow = TRUE)
rownames(m) <- c('A', 'B', 'C', 'D')
现在,我想根据各自的距离订购m
行,所以我使用dist()
dist_m <- dist(m)
打印时 dist_m
A B C
B 8.717798
C 9.899495 5.477226
D 2.645751 7.810250 10.246951
由于我想订购它,我尝试sort(dist_m)
打印
[1] 2.645751 5.477226 7.810250 8.717798 9.899495 10.246951
这几乎是我想要的。但如果它还打印了两行的名称,其中一个数字是距离,我会更高兴,如
2.645751 A D
5.477226 B C
7.810250 B D
8.717798 A B
9.899495 A C
10.246951 C D
这当然是可能的,但我不知道如何实现这一目标。
答案 0 :(得分:3)
一种选择是将dist
转换为matrix
,将上三角值替换为0,将melt
,subset
替换为非零值,然后{ {1}}基于“值”列。
order
获得'm1'之后@David Arenburg建议的m1 <- as.matrix(dist_m)
m1[upper.tri(m1)] <- 0
library(reshape2)
m2 <- subset(melt(m1), value!=0)
m2[order(m2$value),3:1]
# value Var2 Var1
#4 2.645751 A D
#7 5.477226 B C
#8 7.810250 B D
#2 8.717798 A B
#3 9.899495 A C
#12 10.246951 C D
选项
base R
答案 1 :(得分:1)
如果您的dist对象中的距离值= 0
我开始使用akrun发布的解决方案来对dist对象的输出进行排序,但在我的情况下,我确实有距离值= 0.为避免使用subset
步骤丢弃这些,我首先使用diag
将上三角形转换为NA,然后将对角线转换为NA(实际上从另一个程序获得了对称矩阵)。最后,我使用subset
,melt
和na.omit
代替order
:
library(reshape2)
#create matrix
m <- matrix (
c( 2, 1, 8, 5,
2, 1, 8, 5,
9, 3, 2, 8,
1, 3, 7, 4),
nrow = 4,
ncol = 4,
byrow = TRUE)
rownames(m) <- c('A', 'B', 'C', 'D')
# use dist
dist_m <- dist(m)
dist_m
# A and B are identical
A B C
B 0.000000
C 9.899495 9.899495
D 2.645751 2.645751 10.246951
m1 <- as.matrix(dist_m)
m1[upper.tri(m1)] <- NA
diag(m1) <- NA
m2 <- melt(m1)
na.omit(m2[order(m2$value),3:1])
结果,A和B之间的成对距离值得以保留:
value Var2 Var1
2 0.000000 A B
4 2.645751 A D
8 2.645751 B D
3 9.899495 A C
7 9.899495 B C
12 10.246951 C D
答案 2 :(得分:0)
使用基数R:
nid | created_by | claimed_by | urgent
1 | 11 | 22 | 1
2 | 22 | 33 | 1
3 | 33 | 11 | 1
1 | 11 | 43 | 0
1 | 11 | 44 | 1