2017-07-06 2 views
0

Ich habe eine Matrix namens crash.data. Ich möchte eine Matrix erstellen, die genau den gleichen, aber mit Zeilen mit Nullen dazwischen, wie in dem folgenden Codeeine Matrix transformieren 0 Zeile einfügen

> 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 

Um dies zu tun, ich bin mit einem für den Zyklus. Gibt es einen schöneren und schnelleren Weg, idealerweise ohne einen Zyklus zu benutzen?

Dank

Antwort

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

A vollständig vektorisiert Methode wäre, (mit @ db der Datenmenge)

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

Eine weitere Alternative ist es, eine Matrix von 0en mit der richtigen Dimension zu konstruieren und dann füllen es in.

# 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 

mit Datenmenge db, dies gibt

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