10

我有以下矩阵

FI1  FI2 YI1 YI2 BAL1 BAL2 GRO1 GRO2  EQ1  EQ2
1 0.22 0.15 0.1 0.1 0.05 0.05 0.05 0.05 0.05 0.05
2 0.22 0.00 0.0 0.0 0.00 0.00 0.00 0.00 0.00 0.00
3 0.22 0.00 0.0 0.0 0.00 0.00 0.00 0.00 0.00 0.00
4 0.22 0.00 0.0 0.0 0.00 0.00 0.00 0.00 0.00 0.00
5 0.22 0.00 0.0 0.0 0.00 0.00 0.00 0.00 0.00 0.00
6 0.22 0.00 0.0 0.0 0.00 0.00 0.00 0.00 0.00 0.00

现在我想让这个矩阵复制 10 次并放入一个矩阵中,使其看起来像这样(我在这里只显示了 2 次)

FI1  FI2 YI1 YI2 BAL1 BAL2 GRO1 GRO2  EQ1  EQ2
1 0.22 0.15 0.1 0.1 0.05 0.05 0.05 0.05 0.05 0.05
2 0.22 0.00 0.0 0.0 0.00 0.00 0.00 0.00 0.00 0.00
3 0.22 0.00 0.0 0.0 0.00 0.00 0.00 0.00 0.00 0.00
4 0.22 0.00 0.0 0.0 0.00 0.00 0.00 0.00 0.00 0.00
5 0.22 0.00 0.0 0.0 0.00 0.00 0.00 0.00 0.00 0.00
6 0.22 0.00 0.0 0.0 0.00 0.00 0.00 0.00 0.00 0.00
1 0.22 0.15 0.1 0.1 0.05 0.05 0.05 0.05 0.05 0.05
2 0.22 0.00 0.0 0.0 0.00 0.00 0.00 0.00 0.00 0.00
3 0.22 0.00 0.0 0.0 0.00 0.00 0.00 0.00 0.00 0.00
4 0.22 0.00 0.0 0.0 0.00 0.00 0.00 0.00 0.00 0.00
5 0.22 0.00 0.0 0.0 0.00 0.00 0.00 0.00 0.00 0.00
6 0.22 0.00 0.0 0.0 0.00 0.00 0.00 0.00 0.00 0.00

有人可以建议我一个简单的方法来完成这个吗?谢谢安德烈亚斯

4

6 回答 6

29

这是另一种方式:

do.call(rbind, replicate(10, m, simplify=FALSE)) # where m is your matrix
于 2013-10-25T13:18:00.887 回答
13

如果您的矩阵被调用m,那么您可以只使用矩阵实际上只是一个原子向量,然后使用原始矩阵的列rep()将其包装起来以获得正确的尺寸。matrix()您必须transpose首先使用t()才能正确堆叠(感谢@MatthewPlourde指出这一点)。此操作完全矢量化,因此应该非常快速和高效。

matrix( rep( t( m ) , 10 ) , ncol = ncol(m) , byrow = TRUE )

例子

m <- matrix( 1:9 , 3 )
matrix( rep( t( m ) , 2 ) , ncol =  ncol(m) , byrow = TRUE )
#     [,1] [,2] [,3]
#[1,]    1    4    7
#[2,]    2    5    8
#[3,]    3    6    9
#[4,]    1    4    7
#[5,]    2    5    8
#[6,]    3    6    9
于 2013-10-25T13:28:07.967 回答
11

做到这一点的数学方法是将矩阵的Kronecker 乘积与一个向量相乘。

mX = matrix(rnorm(100), 10, 10)
mX %x% rep(1, numTimesToRepeat)
于 2015-01-26T09:49:52.873 回答
1

如果您曾经使用过 matlab,repmat 函数非常有用,因为您所要做的就是指定矩阵以及您希望它按行和列复制的次数。这是一个R等价物:

repmat = function(X,m,n){
mx = dim(X)[1]
nx = dim(X)[2]
matrix(t(matrix(X,mx,nx*n)),mx*m,nx*n,byrow=T)} 

m <- matrix(c(1:4), ncol = 2)
repmat(m,2,3)
>
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    3    1    3    1    3
[2,]    2    4    2    4    2    4
[3,]    1    3    1    3    1    3
[4,]    2    4    2    4    2    4
于 2013-10-25T17:58:41.077 回答
0

不优雅,但如果您只想继续工作,则足够简单:

m <- matrix(rnorm(60), ncol = 10)
str(m)
m2 <- rbind(m, m, m, m, m, m, m, m, m, m)
str(m2)
于 2013-10-25T13:14:13.587 回答
0
reprow <- function(x, m) {
    x[rep(seq_len(nrow(x)), times=m),,drop=FALSE]
}

a <- matrix(1:12, 3, 4)
b <- reprow(a, 3)

如果您需要叉指方式,请x[rep(seq_len(nrow(x)), each=m),]改用。

于 2020-03-20T08:19:58.687 回答