我有2个矩阵(expmat
和mat
)。
让我们说expmat
是
[1,] -1 -1 -1 -1 -1
[2,] 1 -1 -1 -1 -1
[3,] -1 1 -1 -1 -1
[4,] 1 1 -1 -1 -1
[5,] -1 -1 1 -1 -1
[6,] 1 -1 1 -1 -1
[7,] -1 1 1 -1 -1
[8,] 1 1 1 -1 -1
和mat
是
[1,] -2 -2 -2 -2 -2
[2,] 2 -2 -2 -2 -2
[3,] -2 2 -2 -2 -2
[4,] 2 2 -2 -2 -2
[5,] -2 -2 2 -2 -2
[6,] 2 -2 2 -2 -2
[7,] -2 2 2 -2 -2
我想在每个循环中创建一个循环,我将expmat
中的一行连接到mat中的所有行,以便最后创建8个矩阵,并且在每个矩阵中,前5列完全相同(来自expmat
的行)和其他列因为它们来自垫子而发生变化。例如,给出的示例的前2个矩阵看起来像
Matrix1
-1 -1 -1 -1 -1 -2 -2 -2 -2 -2
-1 -1 -1 -1 -1 2 -2 -2 -2 -2
-1 -1 -1 -1 -1 -2 2 -2 -2 -2
-1 -1 -1 -1 -1 2 2 -2 -2 -2
-1 -1 -1 -1 -1 -2 -2 2 -2 -2
-1 -1 -1 -1 -1 2 -2 2 -2 -2
-1 -1 -1 -1 -1 -2 2 2 -2 -2
Matrix 2
1 -1 -1 -1 -1 -2 -2 -2 -2 -2
1 -1 -1 -1 -1 2 -2 -2 -2 -2
1 -1 -1 -1 -1 -2 2 -2 -2 -2
1 -1 -1 -1 -1 2 2 -2 -2 -2
1 -1 -1 -1 -1 -2 -2 2 -2 -2
1 -1 -1 -1 -1 2 -2 2 -2 -2
1 -1 -1 -1 -1 -2 2 2 -2 -2
这就是我正在做的事情:
for(row in 1:nrow(expmat)) {
for(row in 1:nrow(expmat)) {
val<-expmat[row,]
val<-as.matrix(val)
dshybrid=merge(t(val),mat, by=0, all=TRUE)
print(dshybrid)}
然而,我得到了所需要的东西
-1 -1 -1 -1 -1 -2 -2 -2 -2 -2
NA NA NA NA NA 2 -2 -2 -2 -2
NA NA NA NA NA -2 2 -2 -2 -2
NA NA NA NA NA 2 2 -2 -2 -2
NA NA NA NA NA -2 -2 2 -2 -2
NA NA NA NA NA 2 -2 2 -2 -2
NA NA NA NA NA -2 2 2 -2 -2
....
答案 0 :(得分:1)
这种方法可以解决问题:
lapply(split(expmat, row(expmat)), function(u){
cbind(matrix(rep(u,nrow(mat)), ncol=ncol(mat), byrow=T), mat)
})
基本上split
会列出expmat
行,然后为每一行复制7次,并与mat
矩阵合并。这将为您提供8个所需的矩阵。
答案 1 :(得分:0)
循环遍历expmat
,cbind
的每一行 - 将其转换为mat
:
lapply(1:nrow(expmat), function(x) cbind(expmat[rep(x,nrow(mat)),],mat) )
需要rep
,以便为要加入的expmat
的每一行重复mat
的单行。例如,一个非常简单的例子:
expmat <- matrix(1:4,nrow=2)
mat <- matrix(5:8,nrow=2)
lapply(1:nrow(expmat), function(x) cbind(expmat[rep(x,nrow(mat)),],mat) )
#[[1]]
# [,1] [,2] [,3] [,4]
#[1,] 1 3 5 7
#[2,] 1 3 6 8
#
#[[2]]
# [,1] [,2] [,3] [,4]
#[1,] 2 4 5 7
#[2,] 2 4 6 8