变换插入零行的矩阵

时间:2017-07-06 14:33:51

标签: r matrix rows

我有一个名为crash.data的矩阵。我想创建一个完全相同的矩阵,但中间的行为零,如下面的代码所示

> head(crash.data)
            [,1]       [,2]       [,3]
[1,]  0.14449657 -0.2289661 -0.9065017
[2,]  0.06079472 -0.1801571 -0.9796568
[3,] -0.04159815 -0.2442845 -0.9071650
[4,] -0.01820570 -0.1778194 -0.9765629
[5,] -0.06200437 -0.2801673 -0.9325789
[6,]  0.09424269 -0.2143995 -0.9233422
> graph<-matrix(0,ncol=3,nrow = 4000)
> for (i in seq(2,4000,2)){graph[i,]<-as.matrix(crash.data)[i/2,]}
> head(graph)
            [,1]       [,2]       [,3]
[1,]  0.00000000  0.0000000  0.0000000
[2,]  0.14449657 -0.2289661 -0.9065017
[3,]  0.00000000  0.0000000  0.0000000
[4,]  0.06079472 -0.1801571 -0.9796568
[5,]  0.00000000  0.0000000  0.0000000
[6,] -0.04159815 -0.2442845 -0.9071650

为了做到这一点,我正在使用for循环。是否有更好,更快的方式,理想情况下不使用for循环?

由于

3 个答案:

答案 0 :(得分:2)

#DATA
set.seed(42)
m1 = matrix(rnorm(18), ncol = 3)

m2 = do.call(rbind, lapply(1:NROW(m1), function(i) rbind(rep(0, NCOL(m1)), m1[i,])))

m1
#           [,1]        [,2]       [,3]
#[1,]  1.3709584  1.51152200 -1.3888607
#[2,] -0.5646982 -0.09465904 -0.2787888
#[3,]  0.3631284  2.01842371 -0.1333213
#[4,]  0.6328626 -0.06271410  0.6359504
#[5,]  0.4042683  1.30486965 -0.2842529
#[6,] -0.1061245  2.28664539 -2.6564554

m2
#            [,1]        [,2]       [,3]
# [1,]  0.0000000  0.00000000  0.0000000
# [2,]  1.3709584  1.51152200 -1.3888607
# [3,]  0.0000000  0.00000000  0.0000000
# [4,] -0.5646982 -0.09465904 -0.2787888
# [5,]  0.0000000  0.00000000  0.0000000
# [6,]  0.3631284  2.01842371 -0.1333213
# [7,]  0.0000000  0.00000000  0.0000000
# [8,]  0.6328626 -0.06271410  0.6359504
# [9,]  0.0000000  0.00000000  0.0000000
#[10,]  0.4042683  1.30486965 -0.2842529
#[11,]  0.0000000  0.00000000  0.0000000
#[12,] -0.1061245  2.28664539 -2.6564554

答案 1 :(得分:2)

完全矢量化的方法是(使用@ d.b&#39的数据集)

m1 <- m1[rep(1:nrow(m1), each = 2),]
m1[c(TRUE, FALSE),] <- 0

m1
#            [,1]        [,2]       [,3]
# [1,]  0.0000000  0.00000000  0.0000000
# [2,]  1.3709584  1.51152200 -1.3888607
# [3,]  0.0000000  0.00000000  0.0000000
# [4,] -0.5646982 -0.09465904 -0.2787888
# [5,]  0.0000000  0.00000000  0.0000000
# [6,]  0.3631284  2.01842371 -0.1333213
# [7,]  0.0000000  0.00000000  0.0000000
# [8,]  0.6328626 -0.06271410  0.6359504
# [9,]  0.0000000  0.00000000  0.0000000
#[10,]  0.4042683  1.30486965 -0.2842529
#[11,]  0.0000000  0.00000000  0.0000000
#[12,] -0.1061245  2.28664539 -2.6564554

答案 2 :(得分:1)

另一种方法是构造一个具有正确尺寸的0的矩阵,然后将其填入。

# matrix of 0s, double the number of rows
m2 <- matrix(0, nrow=2*nrow(m1), ncol=ncol(m1))
# fill in every other row using seq to index the rows
m2[seq(2, nrow(m2), 2),] <- m1

使用db的数据集,返回

m2
            [,1]        [,2]       [,3]
 [1,]  0.0000000  0.00000000  0.0000000
 [2,]  1.3709584  1.51152200 -1.3888607
 [3,]  0.0000000  0.00000000  0.0000000
 [4,] -0.5646982 -0.09465904 -0.2787888
 [5,]  0.0000000  0.00000000  0.0000000
 [6,]  0.3631284  2.01842371 -0.1333213
 [7,]  0.0000000  0.00000000  0.0000000
 [8,]  0.6328626 -0.06271410  0.6359504
 [9,]  0.0000000  0.00000000  0.0000000
[10,]  0.4042683  1.30486965 -0.2842529
[11,]  0.0000000  0.00000000  0.0000000
[12,] -0.1061245  2.28664539 -2.6564554