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 :

Indexation d'une matrice : perte des rownames/colnames


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Par défaut Indexation d'une matrice : perte des rownames/colnames
    Bonjour,

    Je cherche à sélectionner de façon automatique certains éléments d'une matrice :

    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
     
    for(i in 1:ncol(mat)){
    selection <- mat[which(mat[,i]>3),i]
    }
     
     
    > selection
    a   b
    10  7
     
    > selection
    [1]
     7
     
    > as.matrix(selection)
         [,1]
    [1,]   7
    Le problème : si une seule "case" dans ma colonne correspond au critère de sélection, je perds les rownames. J'ai essayé d'utiliser la fonction as.matrix() mais cela ne change rien.

    Y a-t-il un moyen de contourner ce problème ?

    Merci d'avance

  2. #2
    Membre éprouvé
    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
    Par défaut
    Bonjour,

    Cela doit pouvoir être possible si vous spécifiez par avance le type de l'objet selection.
    En effet, ici il n'a pas de type prédéfini, ainsi R choisi celui qui lui semble le plus approprié : lorsqu'il y a plusieurs lignes il conserve le format originel (une matrice), lorsqu'il n'y a qu'une seule ligne qui vérifie la condition, R stocke le résultat dans un vecteur à une seule case au lieu de créer une matrice avec une ligne et une colonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    selection <- matrix()
     
    for(i in 1:ncol(mat)){
    selection <- mat[which(mat[,i]>3),i]
    }
    À bientôt

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Par défaut
    Mmh j'ai l'impression que ça ne fonctionne pas car après que selection a été déclaré comme matrice, une nouvelle valeur lui est affectée, qui redevient un vecteur.

    J'ai testé la création d'une matrice puis l'utilisation de rbind(), mais rien à faire, le rowname disparaît, d'ailleurs il disparaît alors même lorsque j'ai plusieurs cases sélectionnées...

  4. #4
    Membre confirmé
    Homme Profil pro
    Analyste Quantitatif / Ingénieur Financier
    Inscrit en
    Janvier 2008
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Analyste Quantitatif / Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2008
    Messages : 163
    Par défaut
    Bonjour,

    C'est une particularité de R qui agace beaucoup de monde, R casse les dimensions et perd les dimnames, il n'y a pas grand choses à faire.

    Le plus simple est de faire à la fin de ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dimnames(selection) <- dimnames(dat)
    Par contre il y a un problème avec ton code, une matrice ne peut avoir un nombre de ligne différent par colonne, or ton code ne le garantit pas. Du coup, tu risques de te retrouver avec une liste à la fin. En plus, pas nécessaire de faire un for pour ce genre de besoin, sauf si tu cherches à appliquer une fonction différente à chaque colonne.

    Voilà ce que je te conseille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    selection <- matrix(NA,nrow(dat);ncol(dat))
    dimnames(selection) <- dimnames(dat)
    selection[dat>3]<-dat[dat>3]
     
    # ou plus simple encore
     
    selection <- dat
    selection[selection<3]<-NA

  5. #5
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Bonjour,

    Le problème est tout simplement lié au fait que par défaut R transforme le résultat en l'objet le plus simple possible (ici en vecteur). L'option qui contrôle ça est drop :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    > mat <- matrix(rep(1:3, 2), ncol=2, dimnames=list(letters[1:3], c("A", "B")))
    > mat
      A B
    a 1 1
    b 2 2
    c 3 3
    > mat[which(mat[ , 1]>=3), 1]
    [1] 3
    > mat[which(mat[ , 1]>=3), 1, drop=FALSE]
      A
    c 3
    NB. je pense que which n'est pas nécessaire pour l'indexation ici.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Par défaut
    Citation Envoyé par pitipoisson Voir le message
    Le problème est tout simplement lié au fait que par défaut R transforme le résultat en l'objet le plus simple possible (ici en vecteur). L'option qui contrôle ça est drop :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > mat[which(mat[ , 1]>=3), 1, drop=FALSE]
    Superbe, c'est exactement ça qu'il me fallait !

    Citation Envoyé par pitipoisson Voir le message
    NB. je pense que which n'est pas nécessaire pour l'indexation ici.
    Ah non ?
    En fait j'ai simplifié mon code pour l'exemple, pour chaque colonne de ma matrice, je sélectionne un certain nombre de cases qui peut être 0, 1 ou plus, j'utilise ces cases pour labelliser un plot, puis je prends la colonne suivante pour labelliser un autre plot... Du coup which me semble plutôt adapté mais il y a encore beaucoup de subtilités de R que j'ignore !

    Citation Envoyé par popsmelove Voir le message
    Par contre il y a un problème avec ton code, une matrice ne peut avoir un nombre de ligne différents par colonnes, or ton code ne le garantie pas.
    ... pas de souci pour ça puisque "selection" est réinitialisée à chaque tour de boucle

    Merci à vous !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/10/2010, 14h23
  2. Réponses: 26
    Dernier message: 20/06/2010, 18h24
  3. Réponses: 2
    Dernier message: 21/04/2010, 09h26
  4. Réponses: 1
    Dernier message: 08/07/2008, 10h37
  5. Réponses: 7
    Dernier message: 13/09/2007, 15h22

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