【问题标题】:Join matrices by both colnames and rownames in R在 R 中通过列名和行名连接矩阵
【发布时间】:2014-05-17 14:58:19
【问题描述】:

我想在 R 中通过列名和行名加入矩阵:

m1 = matrix(c(1,2,3, 11,12,13), nrow = 2, ncol = 3, byrow = TRUE,
           dimnames = list(c("r1", "r2"),
                           c("a", "b", "c")))
m2 = matrix(c(4, 5, 0, 2,3,4), nrow = 2, ncol = 3, byrow = TRUE,
        dimnames = list(c("r2", "r3"),
                        c("d", "b", "c")))

检查 m1:

> m1
    a  b  c
r1  1  2  3
r2 11 12 13

检查 m2:

> m2
   d b c
r2 4 5 0
r3 2 3 4

我想得到如下所示的 m3:

> m3
    a  b  c d
r1  1  2  3 0
r2 11 17 13 4
r3  0  3  4 2

我没有找到一种优雅的方式来做到这一点。使用plyr包中的rbind.fill.matrix函数,可以间接得到m3。

require(plyr)
m3 = rbind.fill.matrix(m1, m2)
rownames(m3) = c(rownames(m1), rownames(m2))
m3[is.na(m3)]=0 # replace na with zero
m3 = t(sapply(by(m3,rownames(m3),colSums),identity)) # aggregate matrix by rownames

我想一定有一些更好的方法可以做到这一点。你有什么建议?

【问题讨论】:

  • 你从哪里得到 17 立方米?
  • @RichardScriven 17 来自r2行b列的位置,具体来说17 = m1[2, 2] + m2[1, 2]

标签: r join matrix merge


【解决方案1】:

我使用了这个代码:

m1 = m1[sort(rownames(m1)),sort(colnames(m1))]
m2 = m2[sort(rownames(m2)),sort(colnames(m2))]

nr = unique(c(rownames(m1),rownames(m2)))
nc = unique(c(colnames(m1),colnames(m2)))

m3 = matrix(0,nr=length(nr),nc=length(nc),dimnames=list(nr,nc))
m3[rownames(m3)%in%rownames(m1),colnames(m3)%in%colnames(m1)]=m1

m3[rownames(m3)%in%rownames(m2),colnames(m3)%in%colnames(m2)]=m3[rownames(m3)%in%rownames(m2),colnames(m3)%in%colnames(m2)]+m2

【讨论】:

    【解决方案2】:

    以下内容似乎有效:

    tmp = rbind(as.data.frame(as.table(m1)), as.data.frame(as.table(m2)))
    #tmp = aggregate(Freq ~ Var1 + Var2, tmp, sum)  #unnecessary   
    xtabs(Freq ~ Var1 + Var2, tmp)
    #    Var2
    #Var1  a  b  c  d
    #  r1  1  2  3  0
    #  r2 11 17 13  4
    #  r3  0  3  4  2
    

    编辑:正如@AnandaMahto 所述,xtabs 是一个“应急表”而不是“重塑数据”函数,因此默认情况下它会求和。

    【讨论】:

    • 在这种情况下您可以跳过聚合步骤,因为xtabs 将负责对这些值求和。
    猜你喜欢
    • 1970-01-01
    • 2012-04-13
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    相关资源
    最近更新 更多