我想通过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
我想必须有更好的方法来做到这一点。你的建议是什么?
答案 0 :(得分:4)
以下似乎有效:
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
是一个应变表'而不是重塑数据'函数,因此,它默认总和。
答案 1 :(得分: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