35 votes

Combiner des matrices dans un tableau en R

Si j'ai créé plusieurs matrices, comment puis-je les combiner en un seul tableau ? J'ai 8 matrices qui ont chacune 200 lignes et 200 colonnes et je dois les combiner dans un tableau avec dim = 200,200,8. Je veux donc que chacune de mes matrices soit une tranche de mon tableau.

37voto

Greg Snow Points 22040

Vous pouvez utiliser le abind de la fonction abind l'emballage :

library(abind)
newarray <- abind( mat1, mat2, mat3, mat4, along=3 )

## or if mats are in a list (a good idea)

newarray <- abind( matlist, along=3 )

25voto

Anthony Damico Points 875

Voici l'exemple pour deux. Vous pouvez facilement l'étendre à huit.

# create two matricies with however many rows and columns
x <- matrix( 1:9 , 3 , 3 )
y <- matrix( 10:18 , 3 , 3 )
# look at your starting data
x
y

# store both inside an array, with the same first two dimensions,
# but now with a third dimension equal to the number of matricies
# that you are combining
z <- array( c( x , y ) , dim = c( 3 , 3 , 2 ) )

# result
z

13voto

thelatemail Points 21202

La version courte est que vous pouvez simplifier un ensemble de matrices en utilisant la fonction : simplify2array :

simplify2array(list(x,y))

Vous trouverez ci-dessous ma réponse précédente montrant comment procéder avec sapply 's simplify= argument, étant donné que simplify2array()' est l'utilitaire appelé par 'sapply()' lorsque 'simplify' n'est pas false - voir le ?sapply fichier d'aide.

Voici une version similaire à abind -ing, mais sans utiliser de paquets supplémentaires. Rassemblez le tout dans un list et utiliser ensuite sapply L'option de l'UE pour simplify= à un "array" après n'avoir rien fait à chaque partie de la liste ( identity renvoie simplement l'objet et est équivalent à function(x) x ) :

sapply(list(x,y), identity, simplify="array")
# similarly to save a couple of keystrokes, the following is usually identical
sapply(list(x,y), I, simplify="array")

#, , 1
#
#     [,1] [,2] [,3]
#[1,]    1    4    7
#[2,]    2    5    8
#[3,]    3    6    9
#
#, , 2
#
#     [,1] [,2] [,3]
#[1,]   10   13   16
#[2,]   11   14   17
#[3,]   12   15   18

Si vous souhaitez conserver les noms de chaque matrice originale dans votre nouveau tableau en tant qu'identifiants, essayez :

sapply(mget(c("x","y")), identity, simplify="array")

3voto

Jeroen Points 4979

Cela dépend si vous voulez les combiner en mode colonne ou en mode ligne. C'est analogue à l'utilisation de cbind y rbind pour combiner les vecteurs en une matrice. Comme R stocke les matrices dans l'ordre des colonnes majeures, c'est le plus facile à réaliser :

matrices <- list(
  matrix( 1:9 , 3 , 3 ),
  matrix( 10:18 , 3 , 3 )
);

#it is assumed all matrices in the list have equal dimensions
array1 <- array(
  data = do.call(cbind, matrices), 
  dim = c(dim(matrices[[1]]), length(matrices))
);

La nouvelle dimension (2 dans ce cas) deviendra la 3e dimension. À en juger par la sortie de la méthode d'impression, cela semble exact, car l'impression est divisée par la dernière dimension :

> print(array1)
, , 1

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

, , 2

     [,1] [,2] [,3]
[1,]   10   13   16
[2,]   11   14   17
[3,]   12   15   18

Cependant, il est parfois nécessaire de les combiner en fonction de la première dimension, par exemple

array2 <- array (
  data = do.call(rbind, lapply(matrices, as.vector)), 
  dim = c(length(matrices), dim(matrices[[1]]))
);

print(array2[1,,])

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9 

Par exemple, supposons que vous souhaitiez assigner ces matrices à un cadre de données en colonnes ; une matrice pour chaque ligne. Les premières dimensions, à savoir nrow doivent correspondre dans le tableau et la base de données :

 mydf <- data.frame(foo = 1:2, row.names=c("first", "second"))
 mydf$bar <- array1
  Error in `$<-.data.frame`(`*tmp*`, "bar", value = 1:18) : 
    replacement has 3 rows, data has 2

 mydf$bar <- array2
 mydf$bar

1voto

Sathish Points 462
library('abind')
abind(m1, m2, m3, along = 2.5)
abind(m1, m2, m3, along = 3)

m4 <- list(m1, m2, m3)
abind(m4, along = 3) 

       along        input = matrix + matrix                       output 
----------------------------------------------------------------------------
        0         split columns and row bind them                 array
        0.5       same as 0                                       array
        1         combine matrices into one matrix by rowwise     matrix
        1.5       split columns and column bind them              array
        2         combine matrices into one matrix by columnwise  matrix
        2.5       Form an array with matrices                     array
        3         Same as 2.5                                     array

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X