排序方阵

时间:2011-01-25 19:43:55

标签: r

我有一个75 x 75方阵。除标签外,其中的所有值均为小数。 我希望得到所有标签对的值都高于或低于我设置的截止值。 说,我有以下

     A     B     C     D
A    1     0.2   0.43  0.16
B    0.2   1     0.86  0.28
C    0.43  0.86  1     0.76
D    0.16  0.28  0.76  1

我想要

B   C   0.86
C   D   0.76
A   C   0.43

我怎样才能解决这个问题(没有重复)?

由于

4 个答案:

答案 0 :(得分:3)

首先,您需要转换为每个值一行的表示;一种方法是通过转换为矩阵然后转换为data.frame。为了避免重复,在转换为数据帧之前将下三角(可能包括对角线)设置为NA,然后获取数值帧的子集,其中值不是NA。

mtx <- matrix( rnorm(16), 4, 4, dimnames = list( LETTERS[1:4], LETTERS[1:4]))
mtx[lower.tri(mtx, diag=TRUE)] <- NA
dx <- as.data.frame(as.table(mtx))
dx <- subset(dx, !is.na(Freq))

然后,您可以根据需要从结果数据框中获取子集。

> subset(dx, Freq>0)
   Var1 Var2      Freq
5     A    B 1.9564158
9     A    C 1.7188939
14    B    D 0.1848542

答案 1 :(得分:2)

一种方法是使用melt包中的reshape fn( 更新 >来避免对称矩阵中的重复,并对最终内容进行排序结果)。

> mtx <- matrix( round(10*rnorm(16)),
                 4, 4, dimnames = list( LETTERS[1:4], LETTERS[1:4]))
> mtx[ upper.tri(mtx)] <- NA
> mtx
    A  B  C  D
A  -7 NA NA NA
B  23 17 NA NA
C   6 -2 20 NA
D -23  8 15 -6
> require(reshape)
> df <- cbind( data.frame(Row = rownames(mtx)), as.data.frame(mtx))
> df.m <- melt(df, id = 'Row', variable_name = 'Col')
> df.m
   Row Col value
1    A   A    -7
2    B   A    23
3    C   A     6
4    D   A   -23
5    A   B    NA
6    B   B    17
7    C   B    -2
8    D   B     8
9    A   C    NA
10   B   C    NA
11   C   C    20
12   D   C    15
13   A   D    NA
14   B   D    NA
15   C   D    NA
16   D   D    -6
> filt <- subset(df.m, value < 0)
> filt[order(filt$value),]
   Row Col value
4    D   A   -23
1    A   A    -7
16   D   D    -6
7    C   B    -2

当然,您可以按照您想要的方式格式化结果,例如

> cat(with(filt, paste(Row, Col, value, '\n')))
 A A -7 
 D A -23 
 C B -2 
 D D -6 

答案 2 :(得分:0)

library(fBasics)
Z <- Triang(X)
data.frame(t(apply(which(Z >= 0.43 & Z < 1 ,arr.ind = T),1,
     function(y) c(rownames(Z)[y[1]],colnames(Z)[y[2]],Z[y[1],y[2]]))))

给出

  X1 X2   X3
A  A  C 0.43
B  B  C 0.86
C  C  D 0.76

答案 3 :(得分:0)

使用矩阵和截止

m <- matrix( rnorm(16), 4, 4, dimnames = list( LETTERS[1:4], LETTERS[1:4]))
cut <- 0

索引满足条件的值,并使用它来提取所需的值和行名称。事后排序

i <- lower.tri(m, diag=TRUE) * m > cut
df <- data.frame(Row=rownames(m)[row(m)[i]], Col=colnames(m)[col(m)[i]],
                 Val=m[i])
df[order(df$Val),]