在R中复制矩阵的行

7
假设我有一个矩阵 m 和一个正整数向量 v,我想做的是得到一个新的矩阵 m_new,并且在 m_new 中,m 的每一行(比如说 m[i, ])都被复制了 v[i] 次。例如:
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的行数通常很大。有没有一种高效的方法来解决这个问题?

2个回答

21
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

这很漂亮! - Kamil S.

3
> 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接