modify - Vectorizando una matriz
r matrix operations (5)
Esta pregunta ya tiene una respuesta aquí:
- Convertir una matriz en una matriz 1 dimensional 10 respuestas
Tengo una gran matriz 2D que es 1000 x 1000. Quiero remodelar esto para que sea una columna (o fila). Por ejemplo, si la matriz era:
A B C
1 4 7
2 5 8
3 6 9
Quiero convertirlo en:
1 2 3 4 5 6 7 8 9
No es necesario que preserve los encabezados de las columnas, solo el orden de los datos. ¿Cómo hago esto usando reshape2
(que es el paquete que reshape2
era el más fácil de usar)?
Solo para aclarar, mencioné la reshape
ya que pensé que era la mejor manera de hacerlo. Veo que hay métodos más simples con los que estoy completamente satisfecho.
Creo que será difícil encontrar un método más compacto que:
c(m)
[1] 1 2 3 4 5 6 7 8 9
Sin embargo, si desea conservar una estructura matricial, entonces esta reelaboración del atributo dim sería efectiva:
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
Habría métodos más compactos para obtener el producto de las dimensiones pero el método anterior enfatiza que el atributo dim es un vector de dos elementos para matrices. Otras formas de obtener el "9" en ese ejemplo incluyen:
> prod(dim(m))
[1] 9
> length(m)
[1] 9
Una forma más simple de hacerlo mediante el uso de la función "sapply" (o lo mismo podría hacerse con ''for'' loop también)
m <- matrix(c(1:9), ncol = 3)
(m1 <- as.numeric(sapply(1:NROW(m), function(i)(m[,i]))))
Una posible solución, pero sin usar 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
Vamos chicos R, vamos a darle al OP una solución reshape2:
> m <- matrix(c(1:9), ncol = 3)
> melt(m)$value
[1] 1 2 3 4 5 6 7 8 9
Simplemente no puedo molestarme en probar cuánto más lento es que c (m). Es lo mismo, sin embargo:
> identical(c(m),melt(m)$value)
[1] TRUE
[EDIT: oh diablos a quien estoy bromeando]
> 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
como.vector (m) debería ser un poco más eficiente que 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