假设我有一个矩阵m和一个正整数向量v,我想要做的是得到一个新的矩阵,m_new并且m(比如说m[i, ])的每一行都被复制了v[i]几次m_new.例如:
m = matrix(1:6, nrow = 3)
## [,1] [,2]
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
v = c(3, 1, 2)
Run Code Online (Sandbox Code Playgroud)
而m_new应该是:
[,1] [,2]
[1,] 1 4 # m[1, ] is replicated by
[2,] 1 4 # v[1] = 3
[3,] 1 4 # times
[4,] 2 5
[5,] 3 6
[6,] 3 6
Run Code Online (Sandbox Code Playgroud)
一个for循环将使它适用于小案例:
m_new = matrix(0, sum(v), ncol(m))
k = 1
for(i in 1:nrow(m)){
for(j in k:(k+v[i]-1)){
m_new[j, ] = m[i, ]
}
k = k + v[i]
}
Run Code Online (Sandbox Code Playgroud)
,但m现实世界中的行数通常很大.有没有有效的方法来做到这一点?
Jul*_*ora 14
m[rep(1:nrow(m), times = v), ]
# [,1] [,2]
# [1,] 1 4
# [2,] 1 4
# [3,] 1 4
# [4,] 2 5
# [5,] 3 6
# [6,] 3 6
Run Code Online (Sandbox Code Playgroud)