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 :

Supprimer valeur redondante matrice


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut Supprimer valeur redondante matrice
    Bonsoir à tous,

    Je suis confrontée à un problème, et j'aimerai savoir si je peux le régler grace à R.

    Je dispose d'une matrice m, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
         a      b     
    [1,] "A201" "251" 
    [2,] "A202" "108" 
    [3,] "A203" "583" 
    [4,] "A205" "87"  
    [5,] "A202" "756" 
    [6,] "A199" "78"  
    [7,] "A202" "1680"

    je souhaiterai savoir s'il existe un moyen de supprimer, "A202" qui est présent trois fois dans la matrice, en ne gardant seulement la ligne pour laquelle b est minimale, donc dans l'exemple ci dessus, là ou b=108 ...
    Je veux donc supprimer les lignes 5 et 7

    Merci d'avance pour l'attention que vous porterez à ma question.

    Isa

  2. #2
    Membre éprouvé
    Inscrit en
    Mai 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 74
    Par défaut
    Salut
    Tout d'abord je voudrais savoir comment comparer des chiffres dans ta matrice alors que tu n'a que des chaînes de caractères, en effet dans R on ne peut mixer les types dans un objet de classe matrix (soit tu n'a que des chiffres dans ta matrice, ou des charactères par exemple...) donc dans ton exemple, le minimum de b n'a pas trop de sens, ce que je te conseille au préalable c'est plutôt d'utiliser un data.frame.
    J'essairai de repondre à ta préoccupation en utilisant un data.frame (il faut bien que la colonne b soit numérique sinon on n'a pas de minimum).

    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
    Data <- data.frame(a = paste("A", c(201, 202, 203, 205, 202, 199, 202), sep=""), b = c(251, 108, 583, 87, 756, 78, 1680), stringsAsFactors = FALSE)
     
    R> Data
         a    b
    1 A201  251
    2 A202  108
    3 A203  583
    4 A205   87
    5 A202  756
    6 A199   78
    7 A202 1680
     
    # on reordonne le data.frame suivant la colonne a et en cas d'égalité selon b
    Data.sort <- Data[order(Data[,1], Data[,2]), ]
     
    R> Data.sort
         a    b
    6 A199   78
    1 A201  251
    2 A202  108
    5 A202  756
    7 A202 1680
    3 A203  583
    4 A205   87
     
    # et puis il suffit d'utiliser la fonction duplicated
    result <- Data.sort[!duplicated(Data.sort[,1]),]
     
    R> result
         a   b
    6 A199  78
    1 A201 251
    2 A202 108
    3 A203 583
    4 A205  87
    Ce qui est bien avec R, ce que on peut en faire une fonction par exemple si on doit repeter cette opération plusieurs fois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    montri <- function(dat) {
        dat <- dat[order(dat[,1], dat[,2]), ]
        dat <- dat[!duplicated(dat[,1]),]
        dat
    }
    Maintenans essayons notre fonction sur un exemple plus compliqué

    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
    # pour la reproductibilité des résultats
    set.seed(1)
    # un jeu de donnée plus grand
    Data2 <- data.frame(x = c("Z", "Y", "W", sample(LETTERS[1:5], size = 20, replace = TRUE)), y = runif(23, 5, 40))
     
    R> Data2
       x      y
    1  Z 37.715
    2  Y 12.425
    3  W 27.809
    4  B  9.394
    5  B 14.353
    6  C 18.514
    7  E  5.469
    8  B 18.384
    9  E 35.439
    10 E 16.912
    11 D 21.873
    12 D 25.985
    13 A 22.274
    14 B 11.518
    15 A 33.958
    16 D 28.396
    17 B 32.798
    18 D  8.778
    19 C 30.330
    20 D 19.395
    21 E 33.733
    22 B 27.647
    23 D 32.403
     
    # en appliquant la fonction on obtient :
    R> montri(Data2)
       x      y
    13 A 22.274
    4  B  9.394
    6  C 18.514
    18 D  8.778
    7  E  5.469
    3  W 27.809
    2  Y 12.425
    1  Z 37.715
     
    # tu peux directement faire
    result <- montri(Data2)
    Cette fonction (ou cette méthode) n'a pas été optimisé, ni testé sur autre chose que ces deux exemples, a priori il ne devrait pas avoir de problème mais bon il existe surement une facon plus simple de faire ce que tu demande.

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut
    Merci beaucoup, cela fonctionne parfaitement !

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

Discussions similaires

  1. Supprimer valeur dans zone de liste
    Par benjisan dans le forum Access
    Réponses: 3
    Dernier message: 27/06/2007, 14h45
  2. [formulaire] bouton supprimer valeurs
    Par norfaulk dans le forum IHM
    Réponses: 9
    Dernier message: 18/06/2007, 15h11
  3. supprimer valeur par defaut
    Par subak dans le forum Oracle
    Réponses: 4
    Dernier message: 19/02/2007, 09h26
  4. [VBA/Excel] Supprimer valeur de cellule
    Par amd64 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/07/2006, 12h41
  5. Attribution de valeur à une matrice
    Par Progs dans le forum C++
    Réponses: 13
    Dernier message: 24/09/2005, 23h43

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