ajouter un numéro d'ordre selon 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

Damien Eden
Messages : 19
Enregistré le : 21 Sep 2017, 09:56

ajouter un numéro d'ordre selon un facteur

Messagepar Damien Eden » 09 Mar 2018, 11:17

Bonjour,
J'ai un data frame avec deux colonnes

Code : Tout sélectionner

date=rep(c("01 avr",  "01 dec","01 aou","01 jun"),4)
annee=rep(c(2005,2006,2007,2008),each=4)
df<-data.frame(annee,date)


J'aimerais ajouter une colonne me permettant après un tri sur les colonnes année et date, de numéroter automatiquement dans une colonne c, le numéro d'ordre de la date dans l'année

Code : Tout sélectionner

annee   date      ordre
2005      01 avr   1
2005      01 jun   2
2005      01 aou   3
2005      01 déc   4
2006      01 avr   1
...


Quelle commande puis-je utiliser pour cela?
Merci d'avance,
Damien

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

Re: ajouter un numéro d'ordre selon un facteur

Messagepar Pierre-Yves Berrard » 09 Mar 2018, 13:04

Bonjour,

Est-ce qu'il n'y a que 4 dates possibles ou bien plus ?
PY

Damien Eden
Messages : 19
Enregistré le : 21 Sep 2017, 09:56

Re: ajouter un numéro d'ordre selon un facteur

Messagepar Damien Eden » 09 Mar 2018, 13:07

Il y a plus de 1 à n dates possibles, le maximum étant une dizaine, et ce ne sont pas les mêmes dates.

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: ajouter un numéro d'ordre selon un facteur

Messagepar Eric Casellas » 09 Mar 2018, 13:41

Bonjour,

Il y a la fonction order qui permet de renvoyer les permutation d'index pour obtenir une série monotone.
Cependant pour l'utiliser dans ton cas je pense qu'il te faudrait au préalable convertir tes dates en un format de date de R pour qu'il puisse les classer en utilisant leurs opérateurs de comparaison... (ou alors t'assurer que l'ordre des niveaux de factor de ta colonne date correspond bien à un ordre de dates croissantes)

Eric
Eric

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: ajouter un numéro d'ordre selon un facteur

Messagepar Serge Rapenne » 09 Mar 2018, 14:22

Bonjour,

une solution possible qui rejoint l'idée de Eric de passer par un format de date R.
C'est un peu tordu car les abréviations des mois du data frame d'origine ne sont pas "standard"

Code : Tout sélectionner

modif_date<-data.frame(num=1:12,
                       mois_perso=c("","","","avr","","jun","","aou","","","","dec") #on crée un data.frame pour convertir les noms de mois dans qq chose de compréhensible pour R

#on transforme le champ date en date R
#puis on transforme ces dates en factor
df$ordre<-as.integer(as.factor(as.POSIXct(paste(substr(df$date,1,2),modif_date$num[match(substring(df$date,4),modif_date$mois_perso)],"2004"),format="%d %m %Y")))
> df
   annee   date  mois ordre
1   2005 01 avr avril      1
2   2005 01 dec  déc.      4
3   2005 01 aou  août      3
4   2005 01 jun  juin      2
5   2006 01 avr avril      1
6   2006 01 dec  déc.      4
7   2006 01 aou  août      3
8   2006 01 jun  juin      2
9   2007 01 avr avril      1
10  2007 01 dec  déc.      4
11  2007 01 aou  août      3
12  2007 01 jun  juin      2
13  2008 01 avr avril      1
14  2008 01 dec  déc.      4
15  2008 01 aou  août      3
16  2008 01 jun  juin      2


Serge

EDIT : Le data frame modif_date n'est pas indispensable, il suffit d'avoir un vecteur
mois_perso=c("avr","jun","aou","dec") la commande devient alors

Code : Tout sélectionner

df$ordre<-as.integer(as.factor(as.POSIXct(paste(substr(df$date,1,2),match(substring(df$date,4),mois_perso),"2004"),format="%d %m %Y")))

un chouia plus simple

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

Re: ajouter un numéro d'ordre selon un facteur

Messagepar Logez Maxime » 09 Mar 2018, 14:58

Bonjour,

Il me semble que dans la réponse de Serge la numération par année ne soit pas prise en compte.
Une possibilité avec dplyr et tidyr :

Code : Tout sélectionner

mois <- c("jan", "fev", "mar", "avr", "mai", "jun", "jul", "aou", "sep",
"oct", "nov", "dec")

df %>% extract(date, c("jour", "Mois"), "(\\d{2}) (\\D+$)", remove = FALSE) %>%
 mutate(Mois = match(Mois, mois)) %>%
 group_by(annee) %>%
 mutate(ordre = order(Mois, jour)) %>%
 select(-jour, -Mois)
Cordialement,
Maxime

Damien Eden
Messages : 19
Enregistré le : 21 Sep 2017, 09:56

Re: ajouter un numéro d'ordre selon un facteur

Messagepar Damien Eden » 09 Mar 2018, 15:03

Mon tableau d'exemple manquait de clarté, excusez-moi.
Voici le bon tableau

Code : Tout sélectionner

IDseq=c(1,1,1,1,1,2,2,2,2,2,2)
DateI=c("12/08/2005","15/08/2005","20/08/2005","12/09/2005","12/10/2005","12/08/2006","15/08/2006","21/08/2006","15/09/2006","12/10/2006","15/10/2006")
df<-data.frame(IDseq, DateI)


Je voudrais que la colonne ordre me permette de donner l'ordre d'apparition de chaque date :

Code : Tout sélectionner

IDseq   DateI      ordre
1      12/08/2005   1
1      15/08/2005   2
1      20/08/2005   3   
1      12/09/2005   4
1      12/10/2005   5
2      12/08/2006   1
2      15/08/2006   2
....

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

Re: ajouter un numéro d'ordre selon un facteur

Messagepar Logez Maxime » 09 Mar 2018, 15:09

Re,

tout dépend de tes dates et de leur format :

Code : Tout sélectionner

 df %>% mutate(Dates = as.Date(DateI, "%d/%m/%Y")) %>%
  group_by(IDseq) %>%
  mutate(ordre = order(Dates)) %>%
  select(-Dates)
Cordialement,
Maxime

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: ajouter un numéro d'ordre selon un facteur

Messagepar Eric Casellas » 09 Mar 2018, 15:15

Logez Maxime a écrit :Re,
tout dépend de tes dates et de leur format :

Remarque : pour des dates au format AAAA-MM-JJ l'ordre alphanumérique (ie. si on les considère comme des chaines de caractères) est le même que celui calendaire...

Eric
Eric

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

Re: ajouter un numéro d'ordre selon un facteur

Messagepar Logez Maxime » 09 Mar 2018, 15:20

Eric Casellas a écrit :Remarque : pour des dates au format AAAA-MM-JJ l'ordre alphanumérique (ie. si on les considère comme des chaines de caractères) est le même que celui calendaire...
D'où ma remarque sur le fait que tout dépend du format date, et de leur stockage.
Par exemple :

Code : Tout sélectionner

df %>% group_by(IDseq) %>% mutate(ordre = order(sub("(\\d{2})(/\\d{2}/)(\\d{4})", "\\3\\2\\1", DateI)))

Cordialement,
Maxime

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: ajouter un numéro d'ordre selon un facteur

Messagepar Serge Rapenne » 09 Mar 2018, 15:24

@Maxime

J'aimerais ajouter une colonne me permettant après un tri sur les colonnes année et date, de numéroter automatiquement dans une colonne c, le numéro d'ordre de la date dans l'année

et l'exemple donné indiquait

Code : Tout sélectionner

annee   date      ordre
2005      01 avr   1
...
2006      01 avr   1
d'ou mon usage de 2004 (une année bissextile au cas ou) comme année pour le passage de la date en POSIXct.

Serge

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

Re: ajouter un numéro d'ordre selon un facteur

Messagepar Logez Maxime » 09 Mar 2018, 15:32

Serge Rapenne a écrit :d'ou mon usage de 2004 (une année bissextile au cas ou) comme année pour le passage de la date en POSIXct.

Est-ce que ça ne fonctionne pas parce que les dates sont identiques dans l'exemple ? Mais si pour une année à la place de "01 avr", il y avait "02 avr" ?

Code : Tout sélectionner

date=rep(c("01 avr",  "01 dec","01 aou","01 jun"),4)
date[5] <- "02 avr"
annee=rep(c(2005,2006,2007,2008),each=4)
df<-data.frame(annee,date)
mois_perso=c("avr","jun","aou","dec")
df$ordre<-as.integer(as.factor(as.POSIXct(paste(substr(df$date,1,2),match(substring(df$date,4),mois_perso),"2004"),format="%d %m %Y")))
df
   annee   date ordre
1   2005 01 avr     1
2   2005 01 dec     5
3   2005 01 aou     4
4   2005 01 jun     3
5   2006 02 avr     2
6   2006 01 dec     5
7   2006 01 aou     4
8   2006 01 jun     3
9   2007 01 avr     1
10  2007 01 dec     5
11  2007 01 aou     4
12  2007 01 jun     3
13  2008 01 avr     1
14  2008 01 dec     5
15  2008 01 aou     4
16  2008 01 jun     3

Cordialement,
Maxime

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: ajouter un numéro d'ordre selon un facteur

Messagepar Serge Rapenne » 09 Mar 2018, 15:38

Effectivement

Serge

Damien Eden
Messages : 19
Enregistré le : 21 Sep 2017, 09:56

Re: ajouter un numéro d'ordre selon un facteur

Messagepar Damien Eden » 16 Mar 2018, 13:06

Bonjour,

Merci pour vos propositions pour traiter des données formatées.

Pour des données comprenant des dates formatées normalement, on peut utiliser la fonction ave()

Code : Tout sélectionner

IDseq=c(1,1,1,1,1,2,2,2,2,2,2)
DateI=c("12/08/2005","15/08/2005","20/08/2005","12/09/2005","12/10/2005","12/08/2006","15/08/2006","21/08/2006","15/09/2006","12/10/2006","15/10/2006")
df<-data.frame(IDseq, DateI)
df$ordre<-with(df, ave(as.numeric(IDseq), IDseq, FUN=seq_along))


et on obtient :

Code : Tout sélectionner

df
   IDseq      DateI ordre
1      1 12/08/2005     1
2      1 15/08/2005     2
3      1 20/08/2005     3
4      1 12/09/2005     4
5      1 12/10/2005     5
6      2 12/08/2006     1
7      2 15/08/2006     2
8      2 21/08/2006     3
9      2 15/09/2006     4
10     2 12/10/2006     5
11     2 15/10/2006     6


Retourner vers « Questions en cours »

Qui est en ligne

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

cron