Trier des colonnes

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

Pierre-Marc Chouinard
Messages : 32
Enregistré le : 03 Fév 2017, 13:50

Trier des colonnes

Messagepar Pierre-Marc Chouinard » 17 Juil 2017, 13:47

SAlut,

Existe-il une fonction du type order, mais qui s'appliquerait aux colonnes ? J'ai un data frame avec plusieurs colonnes représentant différentes années et j'aimerais trier mes colonnes par années sans avoir à les faire à la main.

Merci

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: Trier des colonnes

Messagepar Gabriel Terraz » 17 Juil 2017, 13:57

Salut,
Quelque chose comme ceci ?

Code : Tout sélectionner

f <- data.frame(ann2003=1:2,ann1999=2:1,ann2001=2:1)
df
  ann2003 ann1999 ann2001
1       1       2       2
2       2       1       1
df[,order(names(df))]
  ann1999 ann2001 ann2003
1       2       2       1
2       1       1       2

Pierre-Marc Chouinard
Messages : 32
Enregistré le : 03 Fév 2017, 13:50

Re: Trier des colonnes

Messagepar Pierre-Marc Chouinard » 17 Juil 2017, 14:43

Oui merci ça fonctionne très bien...

Par contre ça m'a fait realiser que 2 de mes colonnes ne sont pas des années. Avec ce tri il se retrouve à la fin de mon data frame. Est-ce possible d'applique cette formule de tri à partir d'une coone prédéfinie. Ex. Effectuer ce tri à patir de la troisième colonne. Ce n'est qu'un problème esthétique qui ne me derange pas vraiment, alors si c'est complexe ne perdez pas de temps avec ça.

Sinon est-il possible de tronquer le nom de mes colonnes pour ne retrouver que l'année, comme dans l'exemple illustrer ne conserve que le "2003" et tronquer le "ann".

Merci

et Merci pour la clé de tri ça ma sauver beaucoup de temps.

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: Trier des colonnes

Messagepar Gabriel Terraz » 17 Juil 2017, 14:54

C'est possible, voici un exemple avec le tri à partir de la deuxième colonnes (penser à adapter le code)

Sans rien changer, avec une colonne éjectée à la fin :

Code : Tout sélectionner

df <- data.frame(bb = 3:4,ann2003=1:2,ann1999=2:1,ann2001=2:1)
df
  bb ann2003 ann1999 ann2001
1  3       1       2       2
2  4       2       1       1
df[,order(names(df))]
  ann1999 ann2001 ann2003 bb
1       2       2       1  3
2       1       1       2  4


On garde la première colonne au début :

Code : Tout sélectionner

nbcol <- ncol(df)
df[, c(1,order(names(df)[2:nbcol]))]
  bb ann2003 ann1999 bb.1
1  3       1       2    3
2  4       2       1    4

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: Trier des colonnes

Messagepar Gabriel Terraz » 17 Juil 2017, 15:03

Par contre tu ne peux pas conserver seulement les nombres, c'est un bon moyen pour faire n'importe quoi et te compliquer la vie.


Code : Tout sélectionner

df <- data.frame(ann2003=1:2,ann1999=2:1,ann2001=2:1)
names(df) <- sub("ann", "", names(df))
df
  2003 1999 2001
1    1    2    2
2    2    1    1
df$2003
Erreur : unexpected numeric constant in "df$2003"
df$`2003`
[1] 1 2


Par exemple : https://stackoverflow.com/questions/39299665/numeric-column-names-in-r

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

Re: Trier des colonnes

Messagepar Pierre-Yves Berrard » 17 Juil 2017, 15:11

Gabriel Terraz a écrit :On garde la première colonne au début :

Code : Tout sélectionner

nbcol <- ncol(df)
df[, c(1, order(names(df)[2:nbcol]))]
  bb ann2003 ann1999 bb.1
1  3       1       2    3
2  4       2       1    4

Il manque manifestement un +1 (1 étant le nombre de colonnes à ne pas trier).

Code : Tout sélectionner

df[ , c(1, order(names(df)[2:nbcol]) + 1)]

#   bb ann1999 ann2001 ann2003
# 1  3       2       2       1
# 2  4       1       1       2
PY

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: Trier des colonnes

Messagepar Gabriel Terraz » 17 Juil 2017, 15:20

Merci pour la vigilance, je n'avais pas recopié le bon bout de code, c'était pourtant voyant !

Pierre-Marc Chouinard
Messages : 32
Enregistré le : 03 Fév 2017, 13:50

Re: Trier des colonnes

Messagepar Pierre-Marc Chouinard » 17 Juil 2017, 15:22

Merci c'est genial, ça marche très bien et en effet je n'avais pas penser à ces complications en utilisant que des nombres comme noms de colones. Et merci d'avoir été aussi prompt à répondre, ça sauver ma journée.

Merci

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

Re: Trier des colonnes

Messagepar Pierre-Yves Berrard » 17 Juil 2017, 15:25

Un moment d'inattention est vite arrivé !

Sinon, une solution pour trier les colonnes "annXXXX" sans toucher la postition des autres colonnes :

Code : Tout sélectionner

df <- data.frame(bb = 3:4, ann2003=13:14, ann1999=2:1, ab=1:2, ann2001=20:21, aa = 4:5)

indices_ann <- grep("^ann\\d+$", names(df))
col_tri <- names(df)
col_tri[indices_ann] <- sort(names(df)[indices_ann])

df[ , col_tri]

Avantage : pas besoin de se préoccuper du nombre de colonnes à ne pas trier.
PY

Pierre-Marc Chouinard
Messages : 32
Enregistré le : 03 Fév 2017, 13:50

Re: Trier des colonnes

Messagepar Pierre-Marc Chouinard » 17 Juil 2017, 16:54

Désolé il y a queleque chose que j'ai du mal comprendre de la formule, pour conserve une variable au début pas de problem ca marche bien. Cependant quand j'essait de l'adapté pour qu'elle conserve les deux première colonne je me retrouve avec des résultat que je ne parviens pas à m'expliquer.

ex:

df <- data.frame(bb = 3:4,cc=7:8,ann2003=1:2,ann1999=2:1,ann2001=2:1)
df

bb cc ann2003 ann1999 ann2001
1 3 7 1 2 2
2 4 8 2 1 1


nbcol <- ncol(df)
df[, c(1,order(names(df)[2:nbcol])+1)]

j'obtiens:
bb ann1999 ann2001 ann2003 cc
3 2 2 1 7
4 1 1 2 8


Par contre si je veux concerver les colonne bb et cc en premier et trier les colonne suivante:

df[, c(2,order(names(df)[2:nbcol])+1)]
cc ann1999 ann2001 ann2003 cc.1
7 2 2 1 7
8 1 1 2 8

J'ai tenté différentes ittération, mais je n'arrive pas à ajuster la formule pour arrive au résultat souhaité. Il doit y avoir qqc que j'interprète mal dans la formule.


Merci

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

Re: Trier des colonnes

Messagepar Pierre-Yves Berrard » 17 Juil 2017, 17:09

Code : Tout sélectionner

df[, c(1:2, order(names(df)[3:nbcol])+2)]

Je recommande ma méthode, qui est plus flexible.
PY

Pierre-Marc Chouinard
Messages : 32
Enregistré le : 03 Fév 2017, 13:50

Re: Trier des colonnes

Messagepar Pierre-Marc Chouinard » 17 Juil 2017, 19:20

Merci


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité