如何计算不同大小的多个矢量/矩阵的所有可能组合并同时汇总列?

时间:2015-10-03 02:11:30

标签: r matrix combinations

假设我有三个矩阵......

A=matrix(c("a",1,2),nrow=1,ncol=3)
B=matrix(c("b","c",3,4,5,6),nrow=2,ncol=3)
C=matrix(c("d","e","f",7,8,9,10,11,12),nrow=3,ncol=3)

我希望在汇总第2列和第3列时找到第1列(字符或名称)的所有可能组合。结果将是一个长度等于可能组合总数的单个矩阵,在本例中为6。结果看起来像下面的矩阵......

Result <- matrix(c("abd","abe","abf","acd","ace","acf",11,12,13,12,13,14,17,18,19,18,19,20),nrow=6,ncol=3)

我不知道如何在此问题中添加表格,否则我会更具描述性地展示。先感谢您。

1 个答案:

答案 0 :(得分:2)

您在矩阵中混合了characternumeric值,这会将所有元素强制转换为character。将矩阵定义为数字并将character值保留为行名称更好:

A <- matrix(c(1,2),nrow=1,dimnames=list("a",NULL))
B <- matrix(c(3,4,5,6),nrow=2,dimnames=list(c("b","c"),NULL))
C <- matrix(c(7,8,9,10,11,12),nrow=3,dimnames=list(c("d","e","f"),NULL))
#put all the matrices in a list
mlist<-list(A,B,C)

然后我们使用了一些MapReducelapply魔法:

res <-  Reduce("+",Map(function(x,y) y[x,],
               expand.grid(lapply(mlist,function(x) seq_len(nrow(x)))),
               mlist))

最后,我们构建了rownames

rownames(res)<-do.call(paste0,expand.grid(lapply(mlist,rownames)))
#    [,1] [,2]
#abd   11   17
#acd   12   18
#abe   12   18
#ace   13   19
#abf   13   19
#acf   14   20