我有一个名为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循环?
由于
答案 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