我想在 R 中通过 colnames 和 rownames 连接矩阵:

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 

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

请您参考如下方法:

以下似乎有效:

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 是一个“列联表”而不是一个“ reshape 数据”函数,因此它默认求和。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!