R复制矩阵数次,然后按行绑定在一起

use*_*086 7 data-binding r matrix rbind

我有以下矩阵

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
Run Code Online (Sandbox Code Playgroud)

现在我希望将这个矩阵重复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
Run Code Online (Sandbox Code Playgroud)

有人可以给我一个简单的方法来实现这个目标吗?谢谢Andreas

Mat*_*rde 25

这是另一种方式:

do.call(rbind, replicate(10, m, simplify=FALSE)) # where m is your matrix
Run Code Online (Sandbox Code Playgroud)


Sim*_*lon 12

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

matrix( rep( t( m ) , 10 ) , ncol = ncol(m) , byrow = TRUE )
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • OP希望`m`堆叠.这个转置和堆叠.你可以做`矩阵(rep(t(m),2),ncol = ncol(m),byrow = TRUE). (2认同)

tch*_*rty 7

这样做的数学方法是将矩阵的Kronecker乘积与1的向量.

mX = matrix(rnorm(100), 10, 10)
mX %x% rep(1, numTimesToRepeat)
Run Code Online (Sandbox Code Playgroud)

  • 这是一个聪明的解决方案,它将重复行,但以叉指方式重复(即,您将在第 1 行重复“numTimesToRepeat”,然后在第 2 行重复“numTimesToRepeat”)。如果您使用“rep(1,numTimesToRepeat) %x% mX”,您将得到 @user2157086 正在寻找的行为:您将在重复之前遍历所有行。 (3认同)

Bry*_*son 0

不优雅,但如果你只是想继续工作就足够简单了:

m <- matrix(rnorm(60), ncol = 10)
str(m)
m2 <- rbind(m, m, m, m, m, m, m, m, m, m)
str(m2)
Run Code Online (Sandbox Code Playgroud)