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 :

Classer un vecteur depuis un autre


Sujet :

R

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 13
    Points : 12
    Points
    12
    Par défaut Classer un vecteur depuis un autre
    Bonjour,

    Je souhaiterai savoir si c'était possible de classer un vecteur avec un autre vecteur.

    L'exemple suivant seras plus parlant:

    > x
    [1] 13 5 13 3 6 12 15 14 11 15 7 7 11 15 16 14 3 5 9 7 10 10 2 12 14 8 13 16 7 4 5 6 13 9 12
    [36] 9 5 13 8 15 7 11 3 8 13 10 3 5 1 8 3 16 9 13 13 11 2 14 11 16 11 7 11 14 16 16 9 4 4 1
    [71] 14 2 2 10 10 16 10 8 11 16 7 7 7 12 1 7 11 15 12 11 9 6 3 9 1 8 4 5 5 7

    > order.couple
    [1] 9 1 2 4 14 3 16 15 7 12 10 11 8 13 5 6
    Voici mes deux variables, j'aimerai donc pouvoir obtenir un vecteur x qui aurais tout les 9 en première position, puis les 1 etc...

    J'ai essayer order , sort et sort.list mais en vain :s

    J'avais aussi l'idée de remplacer les 9 par un 1, les 1 par 2 etc... mais en vain (la fonction replace montre vite ces limites)

    Merci de votre attention.

  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
    Bonsoir,

    Alors avec des objets appelés az (le grand vecteur) et bz (le petit qui définit l'ordre) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    az
      [1] 12  7 14 13 12 16  1  4  1 14 11 12  2 12  2 14  3  5  5  7  8  8 10  5 14 16 14  9
     [29]  2  6 10  2  9  7 15  9 16 15  9 13  2 13 15 10  1 12  9 12  1 11 13  5 10 12  4 15
     [57]  5  2  5  8 14  3  4  6 13  9  1 16  8 12  5  3 16  9  3  4 11 15  3 12  4 12 11  1
     [85] 15  3  5 14 11  5 11  1 15 11  1  9  6  7 16  3
     
     bz
     [1] 13  5 14  9 11 16 15 10  1  4  6 12  2  3  7  8
    Le principe serait ça, si j'ai bien compris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    az[which(az==bz[1])]
    [1] 13 13 13 13 13
    Ca pourrait se faire avec une boucle for() mais comme en R qui dit boucle for() dit apply() (ou sapply() en l'occurence) ça devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cz <- sapply(bz,function(x)res <- which(az==x))
    resultat <- az[unlist(cz)]
    ou encore, en une ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    resultat <- az[unlist(sapply(bz,function(x)res <- which(az==x)))]
     resultat
      [1] 13 13 13 13 13  5  5  5  5  5  5  5  5  5 14 14 14 14 14 14 14  9  9  9  9  9  9  9
     [29]  9 11 11 11 11 11 11 11 16 16 16 16 16 16 15 15 15 15 15 15 15 10 10 10 10  1  1  1
     [57]  1  1  1  1  1  4  4  4  4  4  6  6  6 12 12 12 12 12 12 12 12 12 12  2  2  2  2  2
     [85]  2  3  3  3  3  3  3  3  7  7  7  7  8  8  8  8
    N'hésite pas si je n'ai pas bien compris la question, mais quoi qu'il en soit, au plaisir !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    C'est exactement ça.

    Maintenant est-il possible de reproduire cela avec une colonne de matrice pour ordonner les lignes de celle-ci ?

    Exemple

    > mtx
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    [1,] 1 2 15 8 6 14 9 15 15 13
    [2,] 1 8 15 1 2 14 12 13 15 12
    [3,] 7 10 2 11 14 13 9 13 9 2
    [4,] 3 6 1 12 8 5 9 9 13 15
    [5,] 8 3 11 13 2 15 12 3 14 4
    [6,] 6 6 1 1 5 10 3 4 8 3
    [7,] 11 15 7 3 13 7 4 4 8 3
    [8,] 4 3 12 4 14 14 11 14 15 7
    [9,] 2 5 6 12 10 12 10 8 3 2
    [10,] 12 15 7 12 2 3 14 10 5 9
    Qu'on range toute les ligne par rapport a la colonne 10 suivant aussi un vecteur

  4. #4
    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,

    Eh bien oui c'est possible!
    Avec mat la matrice dont on doit ranger les lignes pour que les valeurs de la colonne 10 soient dans le même ordre que dans le vecteur bz, ça donne :
    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 <- matrix(sample(c(1:16),100,replace=T),nrow=10, ncol=10)
    bz <- sample(c(1:16),16,replace=F)
     
    mat
          [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
     [1,]    3   14   16    9    5    1   11    5    6     7
     [2,]    5    9   15   12    2   16   15   14    7     9
     [3,]    5    2    9    1    5    8    3   11   16     2
     [4,]    7    6   13   11    8   12   12    5    3     8
     [5,]    8   10    2   13   14    5    4   11   13    14
     [6,]    8    2   13    5    3    3   12    1    5    15
     [7,]   10    9   15   10    4   16   11   15   16     8
     [8,]    5    7   10   12    6    9    1   11   11    14
     [9,]   14   15    1    4   13    3   15    1   15    10
    [10,]   16    9   12   15    9    4    3    9   13    13
     
    > bz
     [1]  4  8  7 15 11  3 10  1  5 12 14 16 13  2  9  6
    De la même façon qu'hier, on récupère la position des valeurs de bz dans la 10ème colonne (on remplace juste az par mat[,10]):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultat <- unlist(sapply(bz,function(x)res <- which(mat[,10]==x)))
    Puis on trie la 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
    mat_bis <- mat[resultat,]
     
    mat_bis
          [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
     [1,]    7    6   13   11    8   12   12    5    3     8
     [2,]   10    9   15   10    4   16   11   15   16     8
     [3,]    3   14   16    9    5    1   11    5    6     7
     [4,]    8    2   13    5    3    3   12    1    5    15
     [5,]   14   15    1    4   13    3   15    1   15    10
     [6,]    8   10    2   13   14    5    4   11   13    14
     [7,]    5    7   10   12    6    9    1   11   11    14
     [8,]   16    9   12   15    9    4    3    9   13    13
     [9,]    5    2    9    1    5    8    3   11   16     2
    [10,]    5    9   15   12    2   16   15   14    7     9
    Si une valeur est présente dans bz mais pas dans la dixième colonne, elle n'est pas prise en compte.
    Et en une ligne ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mat <- mat[unlist(sapply(bz,function(x)res <- which(mat[,10]==x))),]
    Bonne journée,

    Guinue.

  5. #5
    Inactif  
    Profil pro
    " "
    Inscrit en
    Janvier 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : " "

    Informations forums :
    Inscription : Janvier 2008
    Messages : 330
    Points : 254
    Points
    254
    Par défaut
    Bonjour,
    Dans le cas où tu souhaite avoir des lignes ordonnées vous pouvez utiliser la ligne de code ci-dessous, sachant que la fonction order , il faut choisir une direction croissant par defaut ( argument decreasing=FALSE) ou decroissante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mtx <- mtx[order(mtx[,10], decreasing=TRUE),]
    BC

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup tout est nickel.

    Sujet Résolu.

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

Discussions similaires

  1. Création vecteur depuis un autre
    Par recherche888 dans le forum MATLAB
    Réponses: 6
    Dernier message: 30/11/2011, 15h41
  2. Acces a un control depuis une autre classe
    Par schnito dans le forum MFC
    Réponses: 5
    Dernier message: 25/01/2004, 22h14
  3. [BPW]Dialogues non modaux exécutés depuis un autre dialogue
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 07/12/2003, 11h14
  4. Alimentation d'un SGBDR depuis un autre SGBR
    Par samyl dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 17/09/2003, 15h57
  5. Comment basculer le focus depuis une autre form ?
    Par altahir007 dans le forum Composants VCL
    Réponses: 9
    Dernier message: 03/09/2003, 15h54

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