Listes, sous-listes et représentations graphiques

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

Nicolas Lannes
Messages : 14
Enregistré le : 04 Oct 2015, 19:19

Listes, sous-listes et représentations graphiques

Messagepar Nicolas Lannes » 06 Oct 2015, 10:52

Bonjour à tous,
Je rencontre des difficultés au niveau d'une table nommée etude_loco (environ 170 000 lignes).

Cette table comprend plusieurs champs, dont un numéro de modèle (osm_num_immat_ef) pour une série donnée (BB26000).

Un aperçu du début de cette table :

Code : Tout sélectionner

> names(etude_loco)=c("id_intervmai","id_engin","debut_interv","fin_interv","osm_num","osm_serie")
> head(etude_loco)
  id_intervmai id_engin        debut_interv          fin_interv osm_num osm_serie
1      4849736   103539 2010-04-12 14:50:39 2010-04-15 15:10:28 BB26085   BB26000
2      8765441   103539 2013-07-30 09:21:23 2013-07-30 09:21:24 BB26085   BB26000
3      8777423   103539 2013-08-01 13:46:24 2013-08-02 14:01:19 BB26085   BB26000
4      9012662   103539 2013-10-01 08:14:49 2013-10-01 09:40:03 BB26085   BB26000
5      9013520   103539 2013-10-01 09:39:55 2013-10-01 09:39:56 BB26085   BB26000
6      9010855   103539 2013-09-30 19:39:02 2013-09-30 22:08:13 BB26085   BB26000


Je souhaite réaliser deux choses :
(i) calculer le temps moyen d'intervention pour un numéro de série donné (sans tenir compte de l'année)
(ii) calculer le temps moyen d'intervention pour une année donnée (sans tenir compte du modèle)


Pour résoudre mes problématiques, j'ai essayé de "découper" mon tableau initial afin de créer une liste (à l'aide de la fonction split).
Mes colonnes debut_interv et fin_interv sont au format difftime, j'ai ainsi envisagé de créer une nouvelle colonne en soustrayant ces deux colonnes afin d'obtenir un temps, que j'ai converti numériquement par la suite avec la commande as.numeric().

J'ai également essayé de séparer mon tableau suivant les années, en essayant uniquement de conserver la date (dois-je la transformer en numérique ?) :

Code : Tout sélectionner

table=data.frame(etude_loco$fin_interv-etude_loco$debut_interv,format(etude_loco$debut_interv,format="%Y"))
names(table)=c("temps_indispo","annee")
etude_loco=cbind(etude_loco,table)

etude_loco$temps_indispo=as.numeric(etude_loco$temps_indispo)


Par exemple, pour le problème (i), j'ai effectué :

Code : Tout sélectionner

decoupage_prelim=split(etude_loco,etude_loco$osm_num)

qui me retourne bien une liste de tableaux pour un modèle donné

Et c'est là qu'intervient mon souci ; comment-puis je, à partir de cette grande liste constituée de listes plus petites, calculer une moyenne sur la colonne temps_indispo et ce sur chaque élément de la liste ? Comment faire de même si j'envisage de découper mon tableau de base suivant les années et non suivant les modèles ?

J'ai songé à employer des boucles mais ce n'est pas concluant... Je ne sais pas si on indicer suivant les éléments d'une liste. J'aurai voulu, si c'est possible faire quelque chose du type :

Code : Tout sélectionner

créer vecteur de taille longueur de liste
pour i parcourant mes différentes sous listes
calculer moyenne de colonne temps_indispo et la stocker au rang i du dit vecteur
puis afficher un graphique


Je ne sais pas si je suis assez clair, mais je peux préciser davantage d'informations si jamais.
Je pense m'y prendre de la mauvaise manière, mais si vous avez une/des solution(s) qui correspond(ent) à mes problèmes je suis tout ouïe. (Et pas de souci si ça n'a rien à voir avec ce que je tente de faire, du moment que le résultat est concluant !)

Je vous remercie par avance pour votre aide.

Cordialement,
Nicolas.

NB: J'ai une autre question pendant que j'y pense, quelle(s) représentation(s) serait(ent) utile(s) pour mes données ? Je pensais réaliser des diagrammes en bâton, mais en général il faut des fréquences en ordonnées...

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

Re: Listes, sous-listes et représentations graphiques

Messagepar Logez Maxime » 06 Oct 2015, 12:43

Bonjour,

une possibilité avec la librairie dplyr :

Code : Tout sélectionner

etude_loco$debut_interv <- as.POSIXct(as.character(etude_loco$debut_interv), format="%d/%m/%Y %H:%M")


etude_loco$fin_interv <- as.POSIXct(as.character(etude_loco$fin_interv), format="%d/%m/%Y %H:%M")

etude_loco <- etude_loco %>%
  mutate(tps =  fin_interv - debut_interv, year=format(fin_interv, format="%Y"))

etude_loco %>%
  group_by(osm_num) %>%
    summarise(Tm_serie = mean(tps))

etude_loco %>%
  group_by(year) %>%
    summarise(Tm_year = mean(tps))
Cordialement,
Maxime

Navarre Julien
Messages : 367
Enregistré le : 20 Avr 2012, 08:27

Re: Listes, sous-listes et représentations graphiques

Messagepar Navarre Julien » 06 Oct 2015, 12:56

Bonjour, Maxime a répondu plus vite que moi, voici plusieurs autres possibilités avec différentes librairies :

Code : Tout sélectionner

etude_loco$debut_interv <- as.POSIXct(etude_loco$debut_interv)
etude_loco$fin_interv <- as.POSIXct(etude_loco$fin_interv)

#(i) calculer le temps moyen d'intervention pour un numéro de série donné (sans tenir compte de l'année)

#base
with(etude_loco, aggregate(fin_interv - debut_interv, by = list(osm_serie), FUN = mean))

#dplyr
library(dplyr)
etude_loco %>%
  mutate(difftime = fin_interv - debut_interv) %>%
  group_by(osm_serie) %>%
  summarise(mean = mean(difftime))

#data.table
library(data.table)
dt <- data.table(etude_loco)
dt[ , list(mean = mean(fin_interv - debut_interv)), by = osm_serie]

#(ii) calculer le temps moyen d'intervention pour une année donnée (sans tenir compte du modèle)
# par contre je ne sais pas comment tu veux gérer si des interventions se chevauchent sur plusieurs années, je prends juste l'année de départ

#En partant sur ton idée de liste :
#base
liste <- split(etude_loco, format(etude_loco$debut_interv, "%Y"))
lapply(liste, function(x) with(x, mean(fin_interv - debut_interv)))
# pour avoir un data.frame
liste <- split(etude_loco, format(etude_loco$debut_interv, "%Y"))
liste <- lapply(liste, function(x) with(x, mean(fin_interv - debut_interv)))
data.frame(year = names(liste), mean = do.call(rbind, liste), row.names = NULL)

#idée similaire avec plyr
library(plyr)
dlply(etude_loco, .(cut(debut_interv, "1 year")), summarize, mean = mean(fin_interv - debut_interv))
# ou pour avoir un data.frame
ddply(etude_loco, .(year = cut(debut_interv, "1 year")), summarize, mean = mean(fin_interv - debut_interv))

#data.table
dt[ , list(mean = mean(fin_interv - debut_interv)), by = list(format(debut_interv, "%Y"))]

Nicolas Lannes
Messages : 14
Enregistré le : 04 Oct 2015, 19:19

Re: Listes, sous-listes et représentations graphiques

Messagepar Nicolas Lannes » 06 Oct 2015, 12:59

Bonjour,
Merci pour vos réponses, je vais regarder plus en détails :)

Nicolas.

EDIT : @Maxime >> Je te remercie, par contre les deux premières commandes entraînent le remplacement des valeurs par des NA... Pourtant, quand je regarde la classe de l'objet, ça me dit qu'il est de type "POSIXct" "POSIXt".. Je comprends pas trop

@Julien >> Je te remercie aussi. Je pensais que j'aurai du mal à avoir une solution et tu m'en sors 4 ou 5 :D
J'aime beaucoup le fonctionnement de la fonction with et le package data.table. C'était pile ce que je voulais :)

EDIT 2 : Petite question - comment faire, dans le cas (ii) pour que tous les résultats soient retournés en secondes et non pas soit des heures, des minutes ou des secondes ? En vous remerciant.

Navarre Julien
Messages : 367
Enregistré le : 20 Avr 2012, 08:27

Re: Listes, sous-listes et représentations graphiques

Messagepar Navarre Julien » 06 Oct 2015, 15:08

Tu obtiens des NAs simplement car le format spécifié lors de la conversion est le mauvais (il manque les secondes), il faut que tu utilises

Code : Tout sélectionner

format = "%d/%m/%Y %H:%M:%S"


je n'avais pas fait attention que si les unités sont différentes cela pose problème.
En utilisant la méthode avec data.table tu peux faire :

Code : Tout sélectionner

dt[ , list(mean = mean(as.numeric(fin_interv) - as.numeric(debut_interv))), by = list(format(debut_interv, "%Y"))]


Ne pas oublier que les objets POSIX et les dates sont dérrière des numerics

Nicolas Lannes
Messages : 14
Enregistré le : 04 Oct 2015, 19:19

Re: Listes, sous-listes et représentations graphiques

Messagepar Nicolas Lannes » 07 Oct 2015, 09:11

Salut Julien,
J'ai pas bien compris si ta remarque concernait ma réponse envers Maxime ou bien envers la tienne ?

Par ailleurs, vu que tu m'as proposé plusieurs méthodes, à quel moment dois-je changer le format ?

Car j'ai essayé à ce moment-là mais ça n'a rien changé :

Code : Tout sélectionner

etude_loco$debut_interv <- as.POSIXct(etude_loco$debut_interv,format = "%d/%m/%Y %H:%M:%S")
etude_loco$fin_interv <- as.POSIXct(etude_loco$fin_interv,format = "%d/%m/%Y %H:%M:%S")


Si je fais avec la méthode de Maxime :

Code : Tout sélectionner

>etude_loco$debut_interv <- as.POSIXct(as.character(etude_loco$debut_interv), format="%d/%m/%Y %H:%M:%S")
>etude_loco$fin_interv <- as.POSIXct(as.character(etude_loco$fin_interv), format="%d/%m/%Y %H:%M:%S")
>etude_loco <- etude_loco %>%
  mutate(tps =  fin_interv - debut_interv, year=format(fin_interv, format="%Y"))
 
> head(etude_loco)
  id_intervmai id_engin debut_interv fin_interv osm_num osm_serie     tps year
1      7922240   103539         <NA>       <NA> BB26085   BB26000 NA secs <NA>
2     10813668   103539         <NA>       <NA> BB26085   BB26000 NA secs <NA>
3     10823522   103539         <NA>       <NA> BB26085   BB26000 NA secs <NA>
4     10818678   103539         <NA>       <NA> BB26085   BB26000 NA secs <NA>
5     10502758   103539         <NA>       <NA> BB26085   BB26000 NA secs <NA>
6     10502757   103539         <NA>       <NA> BB26085   BB26000 NA secs <NA>


Ce qui fausse la suite :/

Je vous remercie par avance.

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

Re: Listes, sous-listes et représentations graphiques

Messagepar Logez Maxime » 07 Oct 2015, 11:42

Bonjour,

la conversion des données de départ n'est nécessaire que si les données ne sont pas dès le départ au format POSIXct. Sans même le transformer, quand tu fais class(etude_loco$debut_interv) qu'est-ce qu'il te dit ?

Cordialement,
Maxime

Nicolas Lannes
Messages : 14
Enregistré le : 04 Oct 2015, 19:19

Re: Listes, sous-listes et représentations graphiques

Messagepar Nicolas Lannes » 07 Oct 2015, 13:35

Bonjour,
Apparemment c'est au format POSIXct POSIXt :

Code : Tout sélectionner

> class(etude_loco$debut_interv)
[1] "POSIXct" "POSIXt"


Merci Maxime pour le coup de main, du coup ça marche sans faire de modification !
(Je ne l'avais pas compris de cette façon)

Nicolas.

Nicolas Lannes
Messages : 14
Enregistré le : 04 Oct 2015, 19:19

Re: Listes, sous-listes et représentations graphiques

Messagepar Nicolas Lannes » 20 Oct 2015, 15:05

Bonjour,
Je me permets d'écrire de nouveau car j'ai un autre problème mais toujours concernant le même sujet.

J'ai décidé de créer une variable mois_annee qui est de type MM/YYYY
Les différentes modalités sont : 01/1991 02/1991 ... 11/2014 12/2014 (soit 12*25 modalités)

Je voudrais savoir s'il existelun moyen de transformer cette variable qui relève les mois en trimestres ? Si oui, comment procéder ?
Par exemple 01/1991 correspondrait à 1, 02/1991 à 2, etc (découpage des années en trimestres)

En vous remerciant par avance,
HydroFire.


Retourner vers « Questions en cours »

Qui est en ligne

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