IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Extraire des valeurs d'une liste de matrices


Sujet :

R

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Points : 8
    Points
    8
    Par défaut Extraire des valeurs d'une liste de matrices
    Bonjour à tous!

    Je suis bloquée depuis un moment sur ce problème.
    J'ai une liste de matrices comme ci-dessous par exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    test=matrix(c(runif(36)),byrow=T,ncol=6)
    test2=matrix(c(runif(36)),byrow=T,ncol=6)
    test3=matrix(c(runif(36)),byrow=T,ncol=6)
    mat=list(test,test2,test3)
    Je voudrais extraire l'ensemble des valeurs pour chaque indice.
    Par exemple je voudrais avoir un vecteur qui contient les valeurs de la position [1,2] des 3 matrices. Et ainsi de suite pour les autres positions.
    Cerise dans le gâteau, si c'est possible je voudrais éviter d'avoir les valeurs qui dans mon cas, seraient des doublons par exemple [1,2]=[2,1]; [1,3]=[3,1]; [2,3]=[3,2].... et par ailleurs les [1,1],[2,2],[3,3]...

    Merci d'avance

  2. #2
    Membre habitué
    Homme Profil pro
    Analyste
    Inscrit en
    Février 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste

    Informations forums :
    Inscription : Février 2012
    Messages : 62
    Points : 143
    Points
    143
    Par défaut
    Bonjour,

    Voici un code qui pourrait répondre à votre problème. Il se peut cependant que cela prenne un peu de temps si vous travaillez sur de grosses données (boucles for imbriquées).
    Le principe est de créer une seule matrice composée de celles présentes dans la liste pour se détacher des contraintes du format de liste dans ce cas.

    Assez parlé, voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    test=matrix(c(runif(36)),byrow=T,ncol=6)
    test2=matrix(c(runif(36)),byrow=T,ncol=6)
    test3=matrix(c(runif(36)),byrow=T,ncol=6)
    mat=list(test,test2,test3)
     
    #Les matrices sont symétriques donc carrées (ncol aussi bien que nrow)
    pas <- nrow(mat[[1]])
    #initialisation de la matrice globale
    mat_glob <- mat[[1]]
    #Construction de la matrice globale à partir des matrices de la liste
    for(i in 2:length(mat)){
      mat_glob <- matrix(c(mat_glob,mat[[i]]),byrow=T,ncol=pas)
    }
    #Initialisation d'une matrice qui contiendra la liste des valeurs sous forme de
    #vecteurs colonne
    liste_de_vecteur <- NULL
    #Pour ne pas sélectionner les éléments de la diagonale il faut commencer à la
    #deuxième ligne (x=2) et ne parcourir que les colonnes dont l'indice est inférieur
    #celui de la ligne
     
    #Parcoure les lignes (de la ligne 2 à "pas" -> ncol)
    for(x in 2:pas){
    #Vecteur qui définit les lignes qui correspondent à l'indice voulu)
      indices <- seq(from=x,to=nrow(mat_glob),by=pas)
    #Parcoure les colonnes dont l'indice est inférieur à celui de la ligne
      for(y in 1:x-1){
    #Stocke dans un vecteur les cases d'indice similaire
        vec <- mat_glob[indices,y]
    #Colle les vecteurs pour former une matrice, chaque colonne correspond à un
    #indice de case (colonne 1 -> indice [2,1]; colonne 2 -> indice [3,1]; colonne 3 -> indice [3,2]...)
        liste_de_vecteur <- cbind(liste_de_vecteur, vec)
     
      }
    }
    #Affiche la matrice
    print(liste_de_vecteur)
    #Pour vérifier
    print(mat_glob)
    En espérant vous avoir aidé,

    Joyeuses Pâques!

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Points : 8
    Points
    8
    Par défaut
    Merci beaucoup! C'est exactement ce que je voulais. J'avais tenté une boucle imbriquée mais c'était le format "liste" qui me limitait.
    Votre façon d'éviter de sélectionner la diagonale de la matrice et les doublons est très astucieuse!

    Par contre il y a un petit soucis au niveau de la création de la matrice globale. Les valeurs sont décalées. Du coup à la fin quand on a la matrice avec chaque indice dans les colonnes, les valeurs sont décalées.
    Je vous mets un exemple avec des valeurs pour illustrer le problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    test=matrix(c(0.03, 0.41, 0.12, 0.61, 0.60, 0.17, 0.95, 0.46, 0.62),ncol=3)
    test2=matrix(c(0.89, 0.34, 0.57, 0.52, 0.62, 0.28, 0.69, 0.27, 0.15),ncol=3)
    test3=matrix(c(1.00,0.42,0.08,0.32,0.24,0.80,0.70,0.22,0.12),ncol=3)
    mat=list(test,test2,test3)
     
    #liste de matrices
     
    #[[1]]
    #     [,1] [,2] [,3]
    #[1,] 0.03 0.61 0.95
    #[2,] 0.41 0.60 0.46
    #[3,] 0.12 0.17 0.62
     
    #[[2]]
    #     [,1] [,2] [,3]
    #[1,] 0.89 0.52 0.69
    #[2,] 0.34 0.62 0.27
    #[3,] 0.57 0.28 0.15
     
    #[[3]]
    #     [,1] [,2] [,3]
    #[1,] 1.00 0.32 0.70
    #[2,] 0.42 0.24 0.22
    #[3,] 0.08 0.80 0.12
     
    #j’exécute les lignes qui correspondent à la création de la matrice globale
     
    pas <- nrow(mat[[1]])
     
    mat_glob <- mat[[1]]
    for(i in 2:length(mat)){
      mat_glob <- matrix(c(mat_glob,mat[[i]]),byrow=T,ncol=pas)
    }
    #résultat
    mat_glob
     
    #      [,1] [,2] [,3]
    #[1,] 0.03 0.61 0.95
    #[2,] 0.89 0.52 0.69
    #[3,] 0.41 0.60 0.46
    #[4,] 0.34 0.62 0.27
    #[5,] 0.12 0.17 0.62
    #[6,] 0.57 0.28 0.15
    #[7,] 1.00 0.42 0.08
    #[8,] 0.32 0.24 0.80
    #[9,] 0.70 0.22 0.12
     
    #on voit bien qu'il y a un décalage, les trois matrices ne sont pas collées les #unes après les autres
    J'ai modifié juste la ligne de la création de la matrice globale avec la fonction rbind

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    mat_glob=NULL
    for(i in 1:length(mat)){
      mat_glob<-rbind(mat_glob,mat[[i]])
    }
     
    #résultat
    mat_glob
     
    #      [,1] [,2] [,3]
    #[1,] 0.03 0.61 0.95
    #[2,] 0.41 0.60 0.46
    #[3,] 0.12 0.17 0.62
    #[4,] 0.89 0.52 0.69
    #[5,] 0.34 0.62 0.27
    #[6,] 0.57 0.28 0.15
    #[7,] 1.00 0.32 0.70
    #[8,] 0.42 0.24 0.22
    #[9,] 0.08 0.80 0.12
    après le reste du script marche très bien!

    Merci à nouveau!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. masquer des valeurs dans une liste deroulante
    Par titeZ dans le forum IHM
    Réponses: 15
    Dernier message: 09/08/2007, 15h07
  2. Réponses: 1
    Dernier message: 23/05/2007, 11h49
  3. Extraire des valeurs d'une matrice
    Par Kcyril dans le forum MATLAB
    Réponses: 4
    Dernier message: 23/04/2007, 14h59
  4. [Mail] Extraire des informations d'une liste
    Par Justin_C dans le forum Langage
    Réponses: 2
    Dernier message: 02/02/2007, 10h00
  5. [SQL] Problème de récupération des valeurs d'une liste multiple en php
    Par BOLARD dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 01/05/2006, 00h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo