排序dist()的输出

时间:2015-07-23 15:17:13

标签: r sorting distance

我有一个矩阵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

这当然是可能的,但我不知道如何实现这一目标。

3 个答案:

答案 0 :(得分:3)

一种选择是将dist转换为matrix,将上三角值替换为0,将meltsubset替换为非零值,然后{ {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(实际上从另一个程序获得了对称矩阵)。最后,我使用subsetmeltna.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