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.

32
demandé sur Yamaneko 2010-12-31 17:13:22

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
45
répondu 42- 2010-12-31 15:20:14

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
13
répondu EDi 2010-12-31 14:57:06

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 
10
répondu Spacedman 2010-12-31 16:01:10

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
3
répondu df239 2014-01-21 10:43:04

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]))))
0
répondu user36478 2014-10-16 20:26:20