1

因此,我以 130X130 的降序方式一次对矩阵进行排序,并且我想创建一个行名称相同的新矩阵,但每个排序的行列名称是数据所在的位置和括号中的数据在相应的列名称旁边。它有点像创建一个尺寸为 130x130x2 的 psuedo3D 数组,然后将其压缩成一个没有列名的 130x130 矩阵。这是一个较小的例子。

例子

        A   B   C   D   
    A   14  82  18  50
    B   39  95  27  19
    C   60  40  32  15
    D   70  31  69  31

这就是我要的

    A   B(82)   D(50)   C(18)   A(14)
    B   B(95)   A(39)   C(27)   D(19)
    C   A(60)   B(40)   C(32)   D(15)
    D   A(70)   C(69)   B(31)   D(31)

我希望这是有道理的!

谢谢!

4

2 回答 2

6

干得好:

首先,重新创建您的数据:

x <- read.table(text="
        A   B   C   D   
    A   14  82  18  50
    B   39  95  27  19
    C   60  40  32  15
    D   70  31  69  31", header=TRUE)

两个apply()s, apaste()和 a matrix(),剩下的就是细节:

o <- apply(x, 1, order, decreasing=TRUE)
v <- apply(x, 1, sort, decreasing=TRUE)

matrix(paste(names(x)[o], t(v)), ncol=4, byrow=TRUE)

     [,1]   [,2]   [,3]   [,4]  
[1,] "B 82" "D 50" "C 18" "A 14"
[2,] "B 95" "A 39" "C 27" "D 19"
[3,] "A 60" "B 40" "C 32" "D 15"
[4,] "A 70" "C 69" "B 31" "D 31"

编辑:根据 Jeff Allen 的评论,这可以进一步简化为:

t(apply(x, 1, function(x){s <- order(x, decreasing=TRUE); paste(names(x)[s], x[s])}))

  [,1]   [,2]   [,3]   [,4]  
A "B 82" "D 50" "C 18" "A 14"
B "B 95" "A 39" "C 27" "D 19"
C "A 60" "B 40" "C 32" "D 15"
D "A 70" "C 69" "B 31" "D 31"

(由于它只有一个apply,它应该更快。)

于 2012-11-29T21:32:45.670 回答
3

我希望有人会提出一个矢量化的解决方案,但这里有一个选择:

sortTab <- function(tab){
    for (i in 1:nrow(tab)){
        #Get the order of the elements in the current row
        ord <- order(tab[i,], decreasing=TRUE)

        #get the associated column names and values with this ordering      
        res <- paste(colnames(tab)[ord], "(", tab[i,ord], ")", sep="")

        #assign back to the data.frame
        tab[i,] <- res

    }
    tab
}

并使用您的数据进行测试:

txt <- textConnection("        A   B   C   D   
    A   14  82  18  50
    B   39  95  27  19
    C   60  40  32  15
    D   70  31  69  31")
tab <- read.table(txt)

> sortTab(tab)
      A     B     C     D
A B(82) D(50) C(18) A(14)
B B(95) A(39) C(27) D(19)
C A(60) B(40) C(32) D(15)
D A(70) C(69) B(31) D(31)
于 2012-11-29T21:19:15.210 回答