Vectorisation d'une matrice [dupliquer]
cette question a déjà une réponse ici:
- Convertir une matrice 1 matrice dimensionnelle 10 réponses
j'ai une grande matrice 2D qui est de 1000 x 1000. Je veux remodeler ceci pour qu'il soit une colonne (ou une rangée). Par exemple, si la matrice était:
A B C
1 4 7
2 5 8
3 6 9
je veux le transformer en:
1 2 3 4 5 6 7 8 9
je n'ai pas besoin de conserver les en-têtes de colonne, juste l'ordre des données. Comment faire avec reshape2
(qui est le paquet que je pensais le plus facile à utiliser)?
juste pour clarifier, j'ai mentionné reshape
car j'ai pensé que c'était la meilleure façon de le faire. Je peux voir qu'il y a plus simple des méthodes qui me conviennent parfaitement.
5 réponses
je pense qu'il sera difficile de trouver une méthode plus compacte que:
c(m)
[1] 1 2 3 4 5 6 7 8 9
cependant, si vous voulez conserver une structure matricielle, alors ce remaniement de l'attribut dim serait efficace:
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
il y aurait des méthodes plus compactes pour obtenir le produit des dimensions mais la méthode ci-dessus souligne que l'attribut dim est un vecteur à deux éléments pour les matrices. Autres façons d'obtenir le "9" dans cet exemple inclure:
> prod(dim(m))
[1] 9
> length(m)
[1] 9
une solution possible, mais sans utiliser 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
allez les gars, donnons à L'OP une solution reshape2:
> m <- matrix(c(1:9), ncol = 3)
> melt(m)$value
[1] 1 2 3 4 5 6 7 8 9
Je ne peux pas me donner la peine de tester à quel point il est plus lent que c(m). C'est la même chose, cependant:
> identical(c(m),melt(m)$value)
[1] TRUE
[EDIT: oh diable qui suis-je plaisante:]
> 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.vecteur (m) devrait être un peu plus efficace 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
une façon plus simple de le faire en utilisant la fonction "sapply" (ou la même chose pourrait être faite avec la boucle 'for' aussi bien)
m <- matrix(c(1:9), ncol = 3)
(m1 <- as.numeric(sapply(1:NROW(m), function(i)(m[,i]))))