当前位置: 首页 > 知识库问答 >
问题:

R:基于列添加两个不同维度的矩阵

斜高翰
2023-03-14

我有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短三列,所以对于这些列,生成的矩阵将只有来自第一个矩阵的值。

我的方法是:使用colname的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]

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

共有2个答案

冯旭
2023-03-14

所以你想把所有矩阵求和,得到一个矩阵?一种简单但可能缓慢(我怀疑,但对你的矩阵来说可能没什么大不了的)的方法是使用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)
贲文景
2023-03-14

您可以将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
 类似资料:
  • 我有一个包含这类信息的数据帧: 我想添加第三列,如果描述上有,则该列将接收值1,以获得如下内容:

  • 我有两个不同长度的数据帧。我想用CAP*货币和Go*货币与df_cur的乘法来改变数据帧df中的列。这应该在国家和年份必须分别对两个数据家族相同的条件下完成。更具体地说, #df# #df_cur# 所以,我想像这样变换df: #df# 我回顾了许多将两个数据帧大小不同的列相乘得到的答案,但没有任何结果。 我的代码示例: 非常感谢您的宝贵时间!

  • 问题内容: 我有一张有5列的桌子。当我列出表时,我想按一列排序,以便将类型分组在一起,然后按字母顺序对它们进行排序,以便于查找。 是否可以通过两个不同的列? 这是我当前的选择: 我想我正在寻找的是这样的: 问题答案: 您可以通过列名或返回的列号指定ORDER BY。 因此,您可以执行以下操作: 或类似的东西: 您还可以进行升序和降序。因此,如果您想使用“类型降序”但“标题升序”:

  • 我有两个具有经度和纬度值的数据帧,我想从数据帧#2中提取值(例如数据帧#2的第三列),这些值与数据帧1的列匹配...例如,数据帧1有两列(、),数据帧2有三列(、和一些值)...我想在数据帧1中添加第三列,其中的值对应于两个数据帧中两列完全匹配的值,类似于和...在、不匹配的对中,我希望添加,以便第三列(我要添加到数据。帧1)的长度为=。我尝试了merge函数,但在将的两列与的列进行匹配时遇到了困

  • 假设我们有两个矩阵,即和,分别为和。 我们如何才能找到哪些行与行相同(反之亦然)? 优选的输出是矩阵,其行数等于矩阵和之间的标识行,两列,即第一列包含矩阵的行数,第二列包含矩阵的行数。

  • 如何将一个流中的对象同时添加到两个不同的列表中 目前我正在做 要将流中的对象添加到linkedlist“resourceMemory”中,我还想同时将相同的对象添加到另一个列表中,但我找不到它的语法。是否可能,或者每个列表需要两份代码副本?