TRI DANS UNE MATRICE NUMERIQUE

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

Bernard Vallageas
Messages : 10
Enregistré le : 19 Juil 2018, 07:01

TRI DANS UNE MATRICE NUMERIQUE

Messagepar Bernard Vallageas » 19 Juil 2018, 09:08

Bonjour, j'ai construit une matrice numérique de 56 lignes et 44 colonnes, donc de 2 464 éléments. J'ai nommé les lignes et les colonnes, donc chaque élément de la matrice est nommé par le nom d'une colonne et celui d'une ligne. J'opère un tri par la fonction order. Order opère comme si mon objet était un vecteur de 2 464 éléments et fait le classement.
Mais pour chacun des éléments j'ai perdu les noms de la colonne et de la ligne.
Comment faire pour que ces noms restent indiqués après le tri?
Merci de votre réponse.
bernard.vallageas@u-psud.fr.

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

Re: TRI DANS UNE MATRICE NUMERIQUE

Messagepar Pierre-Yves Berrard » 19 Juil 2018, 09:23

Bonjour,

Bernard Vallageas a écrit :J'opère un tri par la fonction order.

Vous voulez trier la matrice avec comme critère de tri une colonne en particulier, une ligne en particulier ?
N'hésitez pas à nous donner la commande que vous avez utilisée.
PY

Bernard Vallageas
Messages : 10
Enregistré le : 19 Juil 2018, 07:01

Re: TRI DANS UNE MATRICE NUMERIQUE

Messagepar Bernard Vallageas » 19 Juil 2018, 12:03

1° je me suis trompé dans ma question, ce n'est pas la fonction order que j'ai utilisée mais la fonction sort. Excusez-moi pour la confusion!.

2° je veux faire un tri absolu, donc indépendant des lignes et des colonnes, simplement classer les 2 464 variables.
Par contre je désire que les noms de la colonne et de la ligne apparaissent toujours à côté de chaque variable une fois le classement effectué, pour que ce classement soit lisible.

Merci de votre aide

BV

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

Re: TRI DANS UNE MATRICE NUMERIQUE

Messagepar Pierre-Yves Berrard » 19 Juil 2018, 12:23

Si le nom de la matrice de départ est m :

Code : Tout sélectionner

m_tri <-
  matrix(
    sort(m),
    nrow = nrow(m),
    dimnames = dimnames(m)
  )
PY

Bernard Vallageas
Messages : 10
Enregistré le : 19 Juil 2018, 07:01

Re: TRI DANS UNE MATRICE NUMERIQUE

Messagepar Bernard Vallageas » 19 Juil 2018, 15:17

Je remercie PYB de sa réponse mais ça ne marche pas. J'ai changé le nom de ma matrice (pi) en (m) et j'ai collé son programme. Voilà ce que j'obtiens :
> m<-pi
> m_tri <-
+ matrix(
+ sort(m),
+ nrow = nrow(m),
+ dimnames = dimnames(m)
+ )
Error in matrix(sort(m), nrow = nrow(m), dimnames = dimnames(m)) :
plage non numérique pour une matrice

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

Re: TRI DANS UNE MATRICE NUMERIQUE

Messagepar Pierre-Yves Berrard » 19 Juil 2018, 15:29

J'ai l'impression qu'il prend "pi" pour la valeur par défaut dans R (3.14159...).
Relancer le bout de programme qui a généré la matrice pi ?
PY

Bernard Vallageas
Messages : 10
Enregistré le : 19 Juil 2018, 07:01

Re: TRI DANS UNE MATRICE NUMERIQUE

Messagepar Bernard Vallageas » 21 Juil 2018, 10:04

Pierre-Yves Berrard a écrit :J'ai l'impression qu'il prend "pi" pour la valeur par défaut dans R (3.14159...).
Relancer le bout de programme qui a généré la matrice pi ?


ma matrice d'origine ne s'appelait pas pi mais piBrchesMondiales et ne créait aucune confusion avec le nombre pi, j'ai simplement simplifié son nom par commodité puis l'ai appelée m pour être en conformité avec votre programme.

Bernard Vallageas
Messages : 10
Enregistré le : 19 Juil 2018, 07:01

Re: TRI DANS UNE MATRICE NUMERIQUE

Messagepar Bernard Vallageas » 21 Juil 2018, 11:50

J'ai dû mal exposé mon problème et le programme que me propose PYB ne répond absolument à mon problème. Je réexpose mon problème avec une matrice très simple 7 x 5.


m<-matrix(c(18,2,4,7,15,3,25,17,12,30,1,33,16,10,9,11,27,13,26,8,6,22,14,34,5,31,32,19,28,35,29,20,21,23,24),ncol=5)
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 18 17 9 22 28
[2,] 2 12 11 14 35
[3,] 4 30 27 34 29
[4,] 7 1 13 5 20
[5,] 15 33 26 31 21
[6,] 3 16 8 32 23
[7,] 25 10 6 19 24
> colnames(m)<-c(a,b,c,d,e)
Erreur : objet 'a' introuvable
> colnames(m)<-c("a","b","c","d","e")
> rownames(m)<-c("x","y","z","t","u","v","w")
> m
a b c d e
x 18 17 9 22 28
y 2 12 11 14 35
z 4 30 27 34 29
t 7 1 13 5 20
u 15 33 26 31 21
v 3 16 8 32 23
w 25 10 6 19 24

J'applique le programme proposé par PYB


> m_tri<-matrix(sort(m),nrow=nrow(m),dimnames=dimnames(m))
> m_tri
a b c d e
x 1 8 15 22 29
y 2 9 16 23 30
z 3 10 17 24 31
t 4 11 18 25 32
u 5 12 19 26 33
v 6 13 20 27 34
w 7 14 21 28 35
>
On obtiient une matrice trié de mêmes dimensions que la matrice d'origine et avec les mêmes dimnames, mais ça "me fait une belle jambe". En effet dans la matrice m d'origine non trié l'éélément 1 était en position bt, ce qui le définissait
En effet dans mon étude (modèle d'économie mondiale) b correspond à un pays (ex. la France) et t une branche de production (ex l'acier) et me dit que la production de l'acier par la France est 1 (ex superbidon). Je veux faire un classement des différentes branches-pays au nombre de 2 464 au niveau mondial, et j'ai donc besoin de savoir une fois le tri effectué que 1 est la production de l'acier par la France, soit bt, ce que ne me dit absolument pas la matrice trié. En fait bt est comme le nom de l'élément 1 de m, et j'ai toujours besoin de connaître le nom une fois le tri effectué.
Merci de vos lumières
BV
bernard.vallageas@u-psud.fr.

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

Re: TRI DANS UNE MATRICE NUMERIQUE

Messagepar Logez Maxime » 23 Juil 2018, 08:21

Bonjour,

je ne suis pas sur d'avoir saisi ce dont tu as besoin, mais de ce que j'ai compris tu peux créer le vecteur qui associe le nom des lignes et des colonnes de m puis les ordonner en fonction des valeur de la matrice m :

Code : Tout sélectionner

m2 <- outer(rownames(m), colnames(m), paste0)
     [,1] [,2] [,3] [,4] [,5]
[1,] "xa" "xb" "xc" "xd" "xe"
[2,] "ya" "yb" "yc" "yd" "ye"
[3,] "za" "zb" "zc" "zd" "ze"
[4,] "ta" "tb" "tc" "td" "te"
[5,] "ua" "ub" "uc" "ud" "ue"
[6,] "va" "vb" "vc" "vd" "ve"
[7,] "wa" "wb" "wc" "wd" "we"

m2[order(m)]
 [1] "tb" "ya" "va" "za" "td" "wc" "ta" "vc" "xc" "wb" "yc" "yb" "tc" "yd" "ua" "vb" "xb" "xa" "wd"
[20] "te" "ue" "xd" "ve" "we" "wa" "uc" "zc" "xe" "ze" "zb" "ud" "vd" "ub" "zd" "ye"
Comme ça tu vois que la plus faible valeur va pour tb et que la plus forte va pour ye.

Après je n'ai pas saisi si tu avais besoin de faire ça colonne par colonne (pays par pays) pour voir comment se classe les branches les unes par rapport aux autres ou si tu devais faire ça globalement.

Cordialement,
Maxime

Bernard Vallageas
Messages : 10
Enregistré le : 19 Juil 2018, 07:01

Re: TRI DANS UNE MATRICE NUMERIQUE

Messagepar Bernard Vallageas » 23 Juil 2018, 16:29

Réponse à Maxime : Très bien c'est exactement ce que je veux : obtenir un vecteur classant les différents
éléments de la matrice

Merci!


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité