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.
Réponses
Trop de publicités?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
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")
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
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
- Réponses précédentes
- Plus de réponses