ré-ordonner un facteur

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

marie-lucile gourlay
Messages : 11
Enregistré le : 02 Sep 2010, 09:33

ré-ordonner un facteur

Messagepar marie-lucile gourlay » 06 Déc 2010, 11:36

Bonjour,

suite à l'utilisation de la fonction "merge" entre 2 data.frame, j'obtiens un data.frame correct mais pour une colonne les facteurs ont été ordonnés:

par ex: pour la colonne "mois", les facteurs sont après utilisation de "merge" ordonnés de 1 à 4 pour chaque id

Code : Tout sélectionner

id      mois
1         1
1         2
1         3
1         4
2         1
2         2
2         3
2         4 ...

or ce que je souhaite c un ordre par id qui n'est ni croissant/décroissant mais que j'avais défini avant le merge, par ex: "3,4,1,2"

Code : Tout sélectionner

id      mois
1         3
1         4
1         1
1         2
2         3
2         4
2         1
2         2 ...


je ne vois comment faire avec les fonctions "order" et "sort" pour remettre les facteurs dans l'ordre que je veux?

merci d'avance pour votre aide.

marie-lucile

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 06 Déc 2010, 12:03

Après le merge, si vos données sont dans myData, faire

Code : Tout sélectionner

myData$id <- factor(as.character(mtData$id), levels = c("3", "4", "1", "2"))
Renaud

Olivier Taugourdeau
Messages : 38
Enregistré le : 15 Oct 2008, 08:27

Messagepar Olivier Taugourdeau » 06 Déc 2010, 12:36

or ce que je souhaite c un ordre par id qui n'est ni croissant/décroissant mais que j'avais défini avant le merge, par ex: "3,4,1,2"


Si vous voulez conserver l'ordre du data.frame d'entrée, essayez l'option sort=False pour merge() (cf. ?merge)
en thèse

marie-lucile gourlay
Messages : 11
Enregistré le : 02 Sep 2010, 09:33

Messagepar marie-lucile gourlay » 06 Déc 2010, 12:53

j'avais aussi essayé mais ça ne fonctionne pas, le tableau reste inchangé

marie-lucile gourlay
Messages : 11
Enregistré le : 02 Sep 2010, 09:33

Messagepar marie-lucile gourlay » 06 Déc 2010, 13:24

je n'avais pas vu la 2ème réponse. Je reprends: j'ai essayé d'utiliser le script envoyé par renaud mais ça ne fonctionne pas, le tableau reste inchangé.

Pour la fonction "merge", si je mets sort=F, ça me mélange tout dans les colonnes et donc ne garde pas l'ordre que j'ai établi initialement

Pascal PLUVINET
Messages : 70
Enregistré le : 15 Sep 2010, 06:04

Messagepar Pascal PLUVINET » 06 Déc 2010, 13:55

Bonjour , pour réordonner un facteur, regardez la fonction reorder() du package gdata.
Pascal PLUVINET
Ingénieur d'études - Géomaticien

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 06 Déc 2010, 17:59

marie-lucile gourlay a écrit :j'avais aussi essayé mais ça ne fonctionne pas, le tableau reste inchangé


Le tableau est bien sûr inchangé (heureusement !!!), mais le facteur a bel et bien été modifié (croix de bois, croix de fer, etc. :-)). Pour vous en convaincre, faites un summary sur le tableau ou le facteur.

Code : Tout sélectionner

> set.seed(121)
> dfr <- data.frame(id = factor(sample(1:4, size = 10, replace = TRUE)),
+                   x = runif(10), y = rnorm(10))
> dfr
   id         x          y
1   2 0.9468806  1.4027953
2   4 0.7827808 -0.8614673
3   3 0.6168685 -0.4008558
4   4 0.1232399 -0.5659581
5   3 0.4770124  0.5446642
6   2 0.2889924  1.0007287
7   2 0.1357514 -1.4690313
8   3 0.6172974  1.2157342
9   1 0.8195231 -1.1587392
10  2 0.7555166  0.5022799
> summary(dfr)
 id          x                y           
 1:1   Min.   :0.1232   Min.   :-1.46903 
 2:4   1st Qu.:0.3360   1st Qu.:-0.78759 
 3:3   Median :0.6171   Median : 0.05071 
 4:2   Mean   :0.5564   Mean   : 0.02102 
       3rd Qu.:0.7760   3rd Qu.: 0.88671 
       Max.   :0.9469   Max.   : 1.40280 
> table(dfr$id)

1 2 3 4
1 4 3 2
>
> dfr$id <- factor(as.character(dfr$id), levels = c("4", "3", "1", "2"))
> dfr
   id         x          y
1   2 0.9468806  1.4027953
2   4 0.7827808 -0.8614673
3   3 0.6168685 -0.4008558
4   4 0.1232399 -0.5659581
5   3 0.4770124  0.5446642
6   2 0.2889924  1.0007287
7   2 0.1357514 -1.4690313
8   3 0.6172974  1.2157342
9   1 0.8195231 -1.1587392
10  2 0.7555166  0.5022799
> summary(dfr)
 id          x                y           
 4:2   Min.   :0.1232   Min.   :-1.46903 
 3:3   1st Qu.:0.3360   1st Qu.:-0.78759 
 1:1   Median :0.6171   Median : 0.05071 
 2:4   Mean   :0.5564   Mean   : 0.02102 
       3rd Qu.:0.7760   3rd Qu.: 0.88671 
       Max.   :0.9469   Max.   : 1.40280 
> table(dfr$id)

4 3 1 2
2 3 1 4


Si votre problème est simplement d'ordonner le tableau, voir la fonction order:

Code : Tout sélectionner

> dfr[order(dfr$id), ]
   id         x          y
2   4 0.7827808 -0.8614673
4   4 0.1232399 -0.5659581
3   3 0.6168685 -0.4008558
5   3 0.4770124  0.5446642
8   3 0.6172974  1.2157342
9   1 0.8195231 -1.1587392
1   2 0.9468806  1.4027953
6   2 0.2889924  1.0007287
7   2 0.1357514 -1.4690313
10  2 0.7555166  0.5022799
Renaud

Charline Fisseau
Messages : 29
Enregistré le : 07 Avr 2016, 06:39

Re: ré-ordonner un facteur

Messagepar Charline Fisseau » 04 Juil 2016, 15:39

J'ai ce tableau la

Code : Tout sélectionner

freqgis                                   gisement
1     0.0000                           Ambleteuse_Plage
2     0.0000            Ambleteuse_Platier d'Ambleteuse
3     0.0000            Ambleteuse_Platier langue chien
4     0.0000                 Ambleteuse_Platier Liettes
5     0.0000               Ambleteuse_Platier sud slack
6     0.0000                    Audresselles nord_Plage
7     0.0000     Audresselles nord_Platier du Rupt cote
8     0.0000    Audresselles nord_Platier du Rupt large
9     0.0000          Audresselles nord_Platier rocheux
10    0.0000                Audresselles sud_Concession
11    0.0000                     Audresselles sud_Plage
12    0.0000              Audresselles sud_Platier Nord
13    0.0000               Audresselles sud_Platier sud
14    0.0000             Authie Fort Mahon_Mollière sud
15       NaN                Baie de Wissant ouest_plage
16       NaN              Baie de Wissant ouest_platier
17   70.0000                        Berck nord_Bouchots


et je souhaite ordonné les lignes selon un classement de gisement , par exemple avoir ceux-ci :

Code : Tout sélectionner

freqgis                                   gisement
15     NaN                        Baie de Wissant ouest_plage
16       NaN              Baie de Wissant ouest_platier
6     0.0000                    Audresselles nord_Plage
7     0.0000     Audresselles nord_Platier du Rupt cote
8     0.0000    Audresselles nord_Platier du Rupt large
9     0.0000          Audresselles nord_Platier rocheux
10    0.0000                Audresselles sud_Concession
11    0.0000                     Audresselles sud_Plage
12    0.0000              Audresselles sud_Platier Nord
13    0.0000               Audresselles sud_Platier sud
3     0.0000            Ambleteuse_Platier langue chien
4     0.0000                 Ambleteuse_Platier Liettes
5     0.0000               Ambleteuse_Platier sud slack
14    0.0000             Authie Fort Mahon_Mollière sud
17   70.0000                        Berck nord_Bouchots


Quelle fonction serait la plus appropriée? order? merci d'avance

Florent Aubry
Messages : 324
Enregistré le : 25 Juin 2010, 10:21

Re: ré-ordonner un facteur

Messagepar Florent Aubry » 05 Juil 2016, 07:58

Si le facteur n'est pas ordonné, order utilise la représentation interne numérique du facteur. Donc, quand le facteur est construit à partir de chaînes de caractères, les étiquettes sont triées selon l'ordre lexicographique construit à partir de la table des caractères, sinon il utilise l'ordre dans lequel les niveaux sont présentés dans l'argument levels. Si le facteur est ordonné, order utilise l'ordre des niveaux.

Charline Fisseau
Messages : 29
Enregistré le : 07 Avr 2016, 06:39

Re: ré-ordonner un facteur

Messagepar Charline Fisseau » 05 Juil 2016, 14:11

D'accord il faut donc ordonner les étiquettes avant de les trier.

Code : Tout sélectionner

data$LIBELLE= factor(data$LIBELLE,levels=c("Cap Blanc nez","Saint-Pô",   "Baie de Wissant ouest",   "Cap Gris Nez",   "Cap Gris Nez-Cran oufs",   "Cran oufs-audresselles",   "Audresselles nord",   "Audresselles sud",   "Ambleteuse",   "Pointe aux oies"")) # ordonner les étiquettes



Lorsque je fais ce code je n'ai plus que des NAs dans ma colonne LIBELLE ... et cela ne me trie pas les lignes avec la fonction order.

Florent Aubry
Messages : 324
Enregistré le : 25 Juin 2010, 10:21

Re: ré-ordonner un facteur

Messagepar Florent Aubry » 05 Juil 2016, 14:38

C'est quoi LIBELLE ? un facteur ou vecteur de chaînes de caractères ? et quelles en sont les valeurs ?

Charline Fisseau
Messages : 29
Enregistré le : 07 Avr 2016, 06:39

Re: ré-ordonner un facteur

Messagepar Charline Fisseau » 05 Juil 2016, 15:19

Pour moi c'est un facteur! Et oui en effet je n'avais pas mis les bon noms, autant pour moi. Donc j'ai réussi à les ordonner mais lorsque je fais

Code : Tout sélectionner

 data[order(data$LIBELLE),]


Il ordonne la colonne LIBELLE mais pas les autres correspondantes or je veux que toutes les colonnes soient aussi ordonner !

Florent Aubry
Messages : 324
Enregistré le : 25 Juin 2010, 10:21

Re: ré-ordonner un facteur

Messagepar Florent Aubry » 05 Juil 2016, 16:10

Code : Tout sélectionner

donnees <- data.frame( F=factor( sample( letters[1:3], size=60, replace=TRUE)), Y=1:60)
donnees <- donnees[order( donnees$F),]


Les lignes sont bien réordonnées et pas seulement F (voir l'ordre des row.names et de Y)

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

Re: ré-ordonner un facteur

Messagepar Logez Maxime » 06 Juil 2016, 07:04

Bonjour,

Une possibilité avec le package dplyr et la fonction match.

Code : Tout sélectionner

tab <- expand.grid(1:4, 1:2)[,2:1]
colnames(tab) <- c("id", "mois")
tab %>% group_by(id) %>% arrange(match(mois, c(3,4,1,2)))
Cordialement,
Maxime

Charline Fisseau
Messages : 29
Enregistré le : 07 Avr 2016, 06:39

Re: ré-ordonner un facteur

Messagepar Charline Fisseau » 06 Juil 2016, 07:08

Merci !!! Mais du coup j'indique l'ordre dans "letters"? Et j'ai oublié de dire que j'ai 54 colonnes du coup, ce code-ci permet de n'ordonner que 2 colonnes. Comment je peux faire pour que toutes mes autres colonnes soient aussi ordonnées ?

Si je fais ce code-ci, ça ne fonctionne pas...

Code : Tout sélectionner

data <- data.frame(F=factor(sample( letters[c("Cap Blanc Nez_pied de falaise",   "Cap Blanc Nez_plage",   "Saint-Pô_plage",   "Saint-Pô_rochers nord",   "Saint-Pô_rochers sud",   "Saint-Pô_roches côte",   "Saint-Pô_roches large",   "Baie de Wissant ouest_plage",   "Baie de Wissant ouest_platier",   "Cap Gris Nez - Cran oeufs_Platier",   "Cap Gris Nez_Plage",   "Cap Gris Nez_Platier de la Petite Dune",   "Cap Gris Nez_Platier de la Sirène",   "Cran oufs audresselles_Plage",   "Cran oufs audresselles_Platier",)], size=nrow(dat2), replace=TRUE)), Y=data)

data <- data[order(data$F),]


Retourner vers « Questions en cours »

Qui est en ligne

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

cron