【问题标题】:R: Adding two matrices with different dimensions based on columnsR:根据列添加两个具有不同维度的矩阵
【发布时间】:2013-10-20 15:54:24
【问题描述】:

我有 22 个矩阵,它们具有相同的行数(即 691)和不同的列数(即 22-25)。我必须在每个矩阵中添加对应于同一行、同一列的值,从而生成一个维度为 691*25 的单个矩阵。

fullanno1 has 691 rows & 25 columns:
>colnames(fullanno1)
[1] "coding-notMod3"                "coding-synonymous"             "coding-synonymous-near-splice"
[4] "intergenic"                    "intron"                        "missense"                     
[7] "missense-near-splice"          "near-gene-3"                   "near-gene-5"                  
[10] "splice-3"                      "splice-5"                      "stop-gained"                  
[13] "stop-gained-near-splice"       "stop-lost"                     "utr-3"                        
[16] "utr-5"                         "CTCF"                          "E"                            
[19] "None"                          "PF"                            "R"                            
[22] "T"                             "TSS"                           "WE"                           
[25] "coding-notMod3-near-splice"   

fullanno2 has 691 rows and 22 columns:
>colnames(fullanno2)

[1] "coding-synonymous"             "coding-synonymous-near-splice" "intergenic"                   
[4] "intron"                        "missense"                      "missense-near-splice"         
[7] "near-gene-3"                   "near-gene-5"                   "splice-3"                     
[10] "splice-5"                      "stop-gained"                   "stop-lost"                    
[13] "utr-3"                         "utr-5"                         "CTCF"                         
[16] "E"                             "None"                          "PF"                           
[19] "R"                             "T"                             "TSS"                          
[22] "WE" 

每个矩阵都是一个带有数值的双精度矩阵。如何添加这两个矩阵,以便获得尺寸为 691*25 的第三个矩阵。因为 fullanno2 短了三列,所以对于这些列,生成的矩阵将仅具有来自第一个矩阵的值。

我的方法: 取 colnames 的 setdiff 以获取较小矩阵中不存在的列,将它们绑定到较小的矩阵,以 0 作为值。然后将两个矩阵相加。

> column.names<-setdiff(colnames(fullanno1),colnames(fullanno2))
[1] "coding-notMod3"             "stop-gained-near-splice"    "coding-notMod3-near-splice"
> column<-0
>cbind(fullanno2,column)
>colnames(fullanno2)[23]<-column.name[1]
>cbind(fullanno2,column)
>colnames(fullanno2)[24]<-column.name[2]
>cbind(fullanno2,column)
>colnames(fullanno2)[25]<-column.name[3]

但这对于所有矩阵来说都变得乏味。有什么建议吗?

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    您可以将matchcolnames 一起使用。例如:

    > m1<-matrix(1,3,5)
    > colnames(m1)<-LETTERS[1:5]
    > m2<-matrix(1:9,3,3)
    > colnames(m2)<-c("D","A","C")
    > m1
         A B C D E
    [1,] 1 1 1 1 1
    [2,] 1 1 1 1 1
    [3,] 1 1 1 1 1
    > m2
         D A C
    [1,] 1 4 7
    [2,] 2 5 8
    [3,] 3 6 9
    
    > m3<-m1
    > mcol<-match(colnames(m2),colnames(m1))
    > m3[,mcol]<-m3[,mcol]+m2
    > m3
         A B  C D E
    [1,] 5 1  8 2 1
    [2,] 6 1  9 3 1
    [3,] 7 1 10 4 1
    

    【讨论】:

    • 谢谢!让我摆脱了困境!
    【解决方案2】:

    所以您想将所有矩阵相加以得到一个矩阵吗?一种简单但可能很慢(我怀疑,但这对您的矩阵可能没什么大不了的)方法是使用plyrreshape2 库。您可以从矩阵列表开始:

    make.matrix <- function() {
      cols <- sample(month.name, runif(1, 2, 12))
      matrix(rnorm(length(cols)*10), 10, length(cols), dimnames=list(NULL, cols))
    }
    
    # Make 10 matrices filled with random numbers, having
    # varying numbers of columns named after months
    my.matrices <- replicate(10, make.matrix())
    

    然后您可以将所有矩阵融合到一个大数据帧中

    matrix.df <- ldply(my.matrices, melt, varnames=c("row", "col"))
    head(matrix.df)
    #   row      col      value
    # 1   1 February -0.4239145
    # 2   2 February  1.1773608
    # 3   3 February -2.9565403
    # 4   4 February  0.3955096
    # 5   5 February -0.3784917
    # 6   6 February -0.6234579
    

    然后将其转换回矩阵。

    sum.matrix <- acast(matrix.df, row ~ col, sum)
    

    【讨论】:

    • 这甚至不需要一秒钟就可以运行!非常高效和干净。 library(plyr) & library(reshape2) 有一些非常好的功能。非常感谢!!!!
    • 不错的答案,+1!看来我是时候学习一下函数了。
    猜你喜欢
    • 2017-07-26
    • 2020-10-27
    • 2020-12-06
    • 2013-09-27
    • 2017-04-06
    • 2017-07-02
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多