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

时间:2012-11-29 21:00:20

标签: r matrix reshape multidimensional-array

所以我在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)

我希望这是有道理的!

谢谢!

2 个答案:

答案 0 :(得分: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(),一个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"

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

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,所以它应该更快。)

答案 1 :(得分: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)