it-swarm.com.de

Vektorisieren einer Matrix

Ich habe eine große 2D-Matrix, die 1000 x 1000 ist. Ich möchte diese so umformen, dass sie eine Spalte (oder Zeile) enthält. Wenn zum Beispiel die Matrix war:

A B C
1 4 7
2 5 8
3 6 9

Ich möchte es aufgeben:

1 2 3 4 5 6 7 8 9

Ich muss die Spaltenüberschriften nicht beibehalten, nur die Reihenfolge der Daten. Wie mache ich das mit reshape2 (welches Paket war das am einfachsten zu benutzende Paket)? 


Zur Klarstellung erwähnte ich reshape, als ich dachte, dies sei der beste Weg, dies zu tun. Ich kann sehen, dass es einfachere Methoden gibt, mit denen ich vollkommen zufrieden bin.

34
djq

Ich denke, es wird schwierig sein, eine kompaktere Methode zu finden als:

c(m)
[1] 1 2 3 4 5 6 7 8 9

Wenn Sie jedoch eine Matrixstruktur beibehalten möchten, wäre diese Überarbeitung des dim-Attributs wirksam:

dim(m) <- c(dim(m)[1]*dim(m)[2], 1)
m
      [,1]
 [1,]    1
 [2,]    2
 [3,]    3
 [4,]    4
 [5,]    5
 [6,]    6
 [7,]    7
 [8,]    8
 [9,]    9

Es gibt kompaktere Methoden, um das Produkt aus den Dimensionen zu erhalten, aber die obige Methode betont, dass das dim-Attribut ein Vektorvektor für Matrizen ist. Andere Möglichkeiten, die "9" in diesem Beispiel zu erhalten, sind:

> prod(dim(m))
[1] 9
> length(m)
[1] 9
47
42-

Eine mögliche Lösung, aber ohne reshape2:

> m <- matrix(c(1:9), ncol = 3)
> m
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> as.vector(m)
[1] 1 2 3 4 5 6 7 8 9
13
EDi

Komm schon, Jungs, lass das OP eine reshape2-Lösung geben:

> m <- matrix(c(1:9), ncol = 3)
> melt(m)$value
[1] 1 2 3 4 5 6 7 8 9

Ich kann mir einfach nicht die Mühe machen, zu testen, wie viel langsamer es ist als c (m). Es ist jedoch dasselbe:

> identical(c(m),melt(m)$value)
[1] TRUE

[EDIT: oh wen soll ich veräppeln?]

> system.time(for(i in 1:1000){z=melt(m)$value})
   user  system elapsed 
  1.653   0.004   1.662 
> system.time(for(i in 1:1000){z=c(m)})
   user  system elapsed 
  0.004   0.000   0.004 
10
Spacedman

as.Vector (m) sollte etwas effizienter sein als c (m):

> library(rbenchmark)
> m <- diag(5000)
> benchmark(
+   vect = as.vector(m), 
+   conc = c(m), 
+   replications=100
+ )
  test replications elapsed relative user.self sys.self user.child sys.child
2 conc          100  12.699    1.177     6.952    5.754          0         0
1 vect          100  10.785    1.000     4.858    5.933          0         0
3
df239

Eine einfachere Möglichkeit, dies zu tun, indem Sie die Funktion "sapply" verwenden (oder dasselbe kann auch mit der for-Schleife ausgeführt werden)

 m <- matrix(c(1:9), ncol = 3)
 (m1 <- as.numeric(sapply(1:NROW(m), function(i)(m[,i]))))
0
user36478