2017-07-06 30 views
0

我有一个矩阵,叫做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 

为了做到这一点,我使用的是用于循环。有没有更好更快的方法,理想情况下不使用循环?

由于

回答

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 
2

一个完全矢量化的方法是,(使用@分贝的数据集)

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

与数据库的数据集,这将返回

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