【问题标题】:How to do basic row name mapping of matrix in R?如何在R中做矩阵的基本行名映射?
【发布时间】:2014-06-06 01:04:34
【问题描述】:

我有一个非常大的矩阵 A,我需要在该矩阵中添加一列,这是该矩阵与另一个名为 B 的矩阵的映射行名称。 矩阵 A 的行名在名为 ID 的列中,它的映射名称在 Sample 列中

这是简单的可复制示例和预期输出。

A<-cbind(c("a","b", "c"), c(1,2,3), c(10,14,15))
rownames(A)<-c("q","w","r")   

> A
  [,1] [,2] [,3]
q "a"  "1"  "10"
w "b"  "2"  "14"
r "c"  "3"  "15"

第二个矩阵,矩阵A的行名在ID列中,它的映射名称在Sample列中:

B<-cbind(c("d1","f2","g5","y4"),c("q","L","w","r"),c("qw","we","zr","ls"))  

colnames(B)<-c("M","ID","Sample"
> B
     M    ID  Sample
[1,] "d1" "q" "qw"  
[2,] "f2" "L" "we"  
[3,] "g5" "w" "zr"  
[4,] "y4" "r" "ls"  
> 

这是预期的输出:

A<-cbind(c("a","b", "c"), c(1,2,3), c(10,14,15), c("qw","zr","ls"))
rownames(A)<-c("q","w","r")    
> A
  [,1] [,2] [,3] [,4]
q "a"  "1"  "10" "qw"
w "b"  "2"  "14" "zr"
r "c"  "3"  "15" "ls"
> 

有人可以帮我在 R 中实现它吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    你也可以在R中使用合并功能。

    > A <-matrix( data = NA, nrow = 3, ncol =3)
    > A[1,] <- c("a" , "1",  "10")
    > A[2,] <- c( "b" , "2" , "14")
    > A[3,] <- c("c" , "3" , "15")
    > 
    > row.names(A) = c("q","w","r")
    > 
    > 
    > B <- matrix(data = "NA" , nrow = 4, ncol = 3)
    > B[1,] <- c("d1" ,"q" ,"qw")
    > B[2,] <- c( "f2" ,"L" ,"we")
    > B[3,] <- c("g5" ,"w", "zr")
    > B[4,] <- c("y4", "r", "ls" )
    > colnames(B) = c("M", "ID",  "Sample")
    > A
      [,1] [,2] [,3]
    q "a"  "1"  "10"
    w "b"  "2"  "14"
    r "c"  "3"  "15"
    > B
         M    ID  Sample
    [1,] "d1" "q" "qw"  
    [2,] "f2" "L" "we"  
    [3,] "g5" "w" "zr"  
    [4,] "y4" "r" "ls"  
    > 
    > C <- merge(A, B, by.x = 0, by.y = "ID" )
    > D <- C[,-5]
    > D
      Row.names V1 V2 V3 Sample
    1         q  a  1 10     qw
    2         r  c  3 15     ls
    3         w  b  2 14     zr
    

    【讨论】:

      【解决方案2】:

      您几乎可以将样本矩阵放在一起。

      虽然我们不能在矩阵上使用$ 运算符,但我们可以使用dimnames(以及行/列号)来对矩阵进行子集化。然后我们可以在A%in%的行名中找到哪个ID

      > cbind(A, B[,"Sample"][B[,"ID"] %in% rownames(A)])
      #   [,1] [,2] [,3] [,4]
      # q "a"  "1"  "10" "qw"
      # w "b"  "2"  "14" "zr"
      # r "c"  "3"  "15" "ls"
      

      【讨论】:

      • 如果B[,"ID"] 中的条目与rownames(A) 中的条目出现的顺序不同,是否有必要首先对B 进行排序? (虽然从问题上看不太清楚,在这种情况下预期的结果是什么)
      • 好点。 order 在矩阵上的工作方式不同,而且有点棘手。如果你想根据这个提交一个答案,我会删除这个。
      猜你喜欢
      • 2019-02-03
      • 2018-02-10
      • 1970-01-01
      • 2019-08-09
      • 2012-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多