Ajouter une ligne dans chaque matrice d'un array

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Diane MANZON
Messages : 56
Enregistré le : 18 Juin 2018, 08:31

Ajouter une ligne dans chaque matrice d'un array

Messagepar Diane MANZON » 24 Jan 2019, 10:32

Bonjour à tous,

J'ai un problème quand j'ajoute une ligne dans chaque matrice de mon array.
Elle s'insère automatiquement après la première ligne or je voudrais qu'elle soit en dernière ligne.

Voici un code reproductible:

Code : Tout sélectionner

data <- matrix(rnorm(56), nrow=4, ncol=14) # matrice de départ
B = 5 # nombre final de matrices
nb_alea = NULL
BS = array(numeric(), c(nrow(data), ncol(data), B)) #array vide
for (i in 1:B) {
  nb_alea=sample(nrow(data), 14, T)
  BS[ , , i] <- array(data[nb_alea,], c(nrow(data), ncol(data))) #matrices générées aléatoirement à partir de la matrice de départ
}

BS <- array(rbind(BS, rnorm(14)), c(nrow=5, ncol=14, B))


Quelqu'un aurait-il une idéé ?

Je vous remercie par avance,
Cordialement,

Diane MANZON

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Ajouter une ligne dans chaque matrice d'un array

Messagepar Pierre-Yves Berrard » 24 Jan 2019, 10:49

Bonjour,

Inclure l'instruction qui ajoute une ligne dans la boucle for (puisque cette opération est réalisée pour chaque matrice) ?
PY

Diane MANZON
Messages : 56
Enregistré le : 18 Juin 2018, 08:31

Re: Ajouter une ligne dans chaque matrice d'un array

Messagepar Diane MANZON » 24 Jan 2019, 12:01

Pierre-Yves Berrard a écrit :Bonjour,

Inclure l'instruction qui ajoute une ligne dans la boucle for (puisque cette opération est réalisée pour chaque matrice) ?


Bonjour Pierre-Yves,

En effet, en l'incluant dans la boucle, ça marche.

Code : Tout sélectionner

data <- matrix(rnorm(56), nrow=4, ncol=14) # matrice de départ
B = 5 # nombre final de matrices
nb_alea = NULL
BS = array(numeric(), c(nrow(data), ncol(data), B)) #array vide
essai <- array(rnorm(14), c(nrow=1, ncol(data), B))
AF = array(numeric(), c(nrow=5, ncol(data), B))
for (i in 1:B) {
  nb_alea=sample(nrow(data), 14, T)
  BS[,,i] <- array(data[nb_alea,], c(nrow(data), ncol(data))) #matrices générées aléatoirement à partir de la matrice de départ
  AF[,,i] <- array(rbind(BS[,,i], essai[,,i]), c(nrow=5, ncol=14))
}


Mais je ne comprends pas pourquoi quand on ne l'inclue pas il met la ligne ajoutée en deuxième position…


Merci de votre aide,

Diane

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Ajouter une ligne dans chaque matrice d'un array

Messagepar Pierre-Yves Berrard » 24 Jan 2019, 13:09

Diane MANZON a écrit :Mais je ne comprends pas pourquoi quand on ne l'inclue pas il met la ligne ajoutée en deuxième position…


Un exemple plus simple et décomposé pour y voir plus clair :

Code : Tout sélectionner

(BS <- array(1:12, c(3, 2, 2)))

Code : Tout sélectionner

# , , 1
#      [,1] [,2]
# [1,]    1    4
# [2,]    2    5
# [3,]    3    6
#
# , , 2
#      [,1] [,2]
# [1,]    7   10
# [2,]    8   11
# [3,]    9   12

rbind "aplatit" l'array de départ et les nouvelles valeurs sont recyclées autant de fois que nécessaire pour former une nouvelle ligne ayant autant d'éléments que dans le vecteur aplati.

Code : Tout sélectionner

(etape1 <- rbind(BS, 101:102))

Code : Tout sélectionner

#    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
# BS    1    2    3    4    5    6    7    8    9    10    11    12
#     101  102  101  102  101  102  101  102  101   102   101   102

array() aplatit à nouveau la matrice etape1 en prenant les valeurs par colonne et par ligne. Il reconstruit un objet à plusieurs dimensions en incluant les éléments dans l'ordre du vecteur aplati

Code : Tout sélectionner

(etape2 <- array(etape1, c(3+1, 2, 2)))

Code : Tout sélectionner

# , , 1
#      [,1] [,2]
# [1,]    1    3
# [2,]  101  101
# [3,]    2    4
# [4,]  102  102
#
# , , 2
#      [,1] [,2]
# [1,]    5    7
# [2,]  101  101
# [3,]    6    8
# [4,]  102  102
PY

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Ajouter une ligne dans chaque matrice d'un array

Messagepar Logez Maxime » 24 Jan 2019, 13:17

Bonjour,

La fonction rbind est faite pour des objets ne dépassant pas les deux dimensions. Or dans ton cas tu pars d'un array de dimension 4 14 5 et de l'autre un vecteur de longueur 14. Du coup pour pouvoir lier les deux en lignes, rbind ramène les objets à des dimensions communes, ici celle du plus simple à savoir le vecteur. Du coup ton array est transformé en vecteur et ton vecteur est recyclé suffisamment de fois pour pouvoir avoir la même longueur que ton array vectorisé (4*14*5) et le tout est passé dans une matrice en ligne puisque tu fais appel a rbind.
Pour la gestion des array et notamment pour avoir l'équivalent de rbind et de cbind, tu peux installer le package abind.
Pour lier ton array et ton vecteur il va te falloir d'abord transformer ton vecteur en array avec les bonnes dimensions : 1 14 5. Pourquoi le 5 ? parce que tu cherches à l'associer à chacune des lignes d'un cube de dimension 5 dans la 3eme dimension.

Code : Tout sélectionner

library(abind)
abind(BS, array(rnorm(14), c(1, 14, 5)), along = 1)
along =1 parce que tu veux faire le lien au niveau des lignes.

Cordialement,
Maxime

Diane MANZON
Messages : 56
Enregistré le : 18 Juin 2018, 08:31

Re: Ajouter une ligne dans chaque matrice d'un array

Messagepar Diane MANZON » 24 Jan 2019, 16:36

Pierre-Yves, j'avoue que j'ai pas tout compris mais merci pour la réponse !

Maxime, super merci beaucoup !!

Cordialement,

Diane


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité