将3D数据压缩为R中的矩阵

Lca*_*t91 1 r matrix multidimensional-array reshape

所以我在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
Run Code Online (Sandbox Code Playgroud)

这就是我要的

    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)
Run Code Online (Sandbox Code Playgroud)

我希望这是有道理的!

谢谢!

And*_*rie 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)
Run Code Online (Sandbox Code Playgroud)

两个apply(),一个paste()和一个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"
Run Code Online (Sandbox Code Playgroud)

编辑:基于杰夫艾伦的评论,这可以进一步简化为:

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"
Run Code Online (Sandbox Code Playgroud)

(因为这只有一个apply它应该更快.)