2013-11-21 35 views
1

假設我有一個矩陣m和一個正整數向量v,我想要做的就是一個新的矩陣m_newm每一行(比如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) 

而且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 

一個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] 
} 

,但m在現實世界中的行數通常很大。有沒有什麼有效的方法來做到這一點?

回答

6
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 
1
> m <- matrix(1:25, ncol=5) 

> m 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 6 11 16 21 
[2,] 2 7 12 17 22 
[3,] 3 8 13 18 23 
[4,] 4 9 14 19 24 
[5,] 5 10 15 20 25 

> apply(m, 2, function(c) rep(c,v)) 

     [,1] [,2] [,3] [,4] [,5] 
[1,] 1 6 11 16 21 
[2,] 2 7 12 17 22 
[3,] 2 7 12 17 22 
[4,] 3 8 13 18 23 
[5,] 3 8 13 18 23 
[6,] 3 8 13 18 23 
[7,] 4 9 14 19 24 
[8,] 4 9 14 19 24 
[9,] 4 9 14 19 24 
[10,] 4 9 14 19 24 
[11,] 5 10 15 20 25 
[12,] 5 10 15 20 25 
[13,] 5 10 15 20 25 
[14,] 5 10 15 20 25 
[15,] 5 10 15 20 25