如何计算多个 vectors/matrices 不同大小的所有可能组合并同时对列求和?
How to compute all possible combinations of multiple vectors/matrices of different sizes and sum up columns simultaneously?
假设我有三个矩阵...
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)
我不知道如何在这个问题中添加一个table,否则我会更详细地展示它。先感谢您。
您在矩阵中混合 character
和 numeric
值,这会将所有元素强制转换为 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)
然后我们使用一些Map
、Reduce
和lapply
魔法:
res <- Reduce("+",Map(function(x,y) y[x,],
expand.grid(lapply(mlist,function(x) seq_len(nrow(x)))),
mlist))
最后,我们构建行名
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
假设我有三个矩阵...
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)
我不知道如何在这个问题中添加一个table,否则我会更详细地展示它。先感谢您。
您在矩阵中混合 character
和 numeric
值,这会将所有元素强制转换为 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)
然后我们使用一些Map
、Reduce
和lapply
魔法:
res <- Reduce("+",Map(function(x,y) y[x,],
expand.grid(lapply(mlist,function(x) seq_len(nrow(x)))),
mlist))
最后,我们构建行名
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