1

したがって、130X130の降順で一度に1行ずつ行列を並べ替えています。行名が同じ新しい行列を作成したいのですが、並べ替えられた各行の列名は、データがあった場所と括弧内のデータです対応する列名の横。次元が 130x130x2 の疑似 3D 配列を作成し、それを列名なしで 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)

2 つapply()の 、 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"

(これには 1 つしかないため、applyさらに高速になるはずです。)

于 2012-11-29T21:32:45.670 に答える
3

誰かがベクトル化されたソリューションを提案してくれることを願っていますが、ここに 1 つのオプションがあります。

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 に答える