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.
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
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
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
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
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]))))