在R中按名称和行名联接矩阵 [英] Join matrices by both colnames and rownames in R

查看:400
本文介绍了在R中按名称和行名联接矩阵的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I would like to join matrices by both colnames and rownames in 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
   d b c
r2 4 5 0
r3 2 3 4

我想得到看起来像这样的m3:

I want to get m3 which looks like this:

> 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.

I did't find an elegant way to do so. Using the rbind.fill.matrix function in package plyr, I can indirectly get 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

我想必须有一些更好的方法来做到这一点.你有什么建议?

I guess there must be some better ways to do so. What's your suggestion?

推荐答案

以下内容似乎有效:

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是一个列联表",而不是重塑数据"功能,因此默认情况下为求和.

edit: As noted by @AnandaMahto, xtabs is a 'contingency-table' and not a 'reshape-data' function and, so, it sums by default.

这篇关于在R中按名称和行名联接矩阵的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆