Optimisation du temps d'exécution

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

Diakaria Korera
Messages : 18
Enregistré le : 07 Juin 2018, 15:51

Optimisation du temps d'exécution

Messagepar Diakaria Korera » 11 Juin 2018, 09:58

Bonjour,
J'ai une table que je suis entrain de modifier en faisant la fusion de tous les événements par seconde. J'ai procédé comme suit:

Code : Tout sélectionner

out<-table%>%group_by(annee, mois,jour,heure, minute,seconde) %>%summarise_all(funs(na.omit(.)[1]))

Mon code marche bien mais le soucis est qu'il met plus de 20 min pour s'exécuter. Je veux savoir si quelqu'un aurait des idées pour l'optimiser.
Merci !
Diakaria
Diakaria
Université Claude Bernard Lyon1

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

Re: Optimisation du temps d'exécution

Messagepar Serge Rapenne » 11 Juin 2018, 10:27

Bonjour,

Une idée à vérifier, il semble que tu ais des variables pour année, mois,jour,heure, minute,seconde. Je pense que regrouper au préalable ces 6 variables en une seule variable de type date devrait accélérer le calcul .

Serge

Diakaria Korera
Messages : 18
Enregistré le : 07 Juin 2018, 15:51

Re: Optimisation du temps d'exécution

Messagepar Diakaria Korera » 11 Juin 2018, 10:45

En fait au début j'avais une variable date de la forme : "AAAA-MM-JJ HH:MN:SS" et je l'ai découpé en 6 pour que je puisse faire la fusion à la seconde près.
Je ne sais pas comment je le ferai avec juste la variable date.
Merci
Diakaria
Université Claude Bernard Lyon1

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

Re: Optimisation du temps d'exécution

Messagepar Serge Rapenne » 11 Juin 2018, 11:41

Qu'appelles tu la fusion à la seconde près ? peut tu donner un exemple des données en entrée et de ce que tu souhaites obtenir . cf : viewtopic.php?f=1&t=3302

Serge

Diakaria Korera
Messages : 18
Enregistré le : 07 Juin 2018, 15:51

Re: Optimisation du temps d'exécution

Messagepar Diakaria Korera » 14 Juin 2018, 13:07

Bonjour Serge,
En fait j'ai dans mon repertoire un certain nombre de tables de tailles différentes. Par exemple avec 3 tables:

Code : Tout sélectionner

tab1 <- structure(list(
  time= structure(1:10, .Label = c("2017-04-27 19:39:32.036","2017-04-28 09:20:13.222","2017-04-28 09:20:54.613",
                                   "2017-04-28 11:30:58.015","2017-04-28 11:31:28.334","2017-04-28 11:32:25.411",
                                   "2017-04-28 11:33:50.444","2017-04-28 14:47:42.557","2017-04-28 14:49:37.136",
                                   "2017-04-28 14:49:46.070"), class = "factor"),
  value = structure(c(2L,1L,2L,1L,2L,1L,2L,1L,2L,1L), .Label = c("ON", "OFF"), class = "factor")),
  .Names = c("time","value"), class = "data.frame", row.names = c(NA,-10L))
tab1$time<- as.POSIXct(tab1$time, format = "%Y-%m-%d %H:%M:%S")



tab2 <- structure(list(
  time= structure(1:10, .Label = c("2017-05-02 15:06:38.546","2017-05-02 15:09:13.441","2017-05-02 15:11:12.512",
                                   "2017-05-02 15:11:45.824","2017-05-02 15:13:15.581","2017-05-02 15:13:18.476",
                                   "2017-05-02 15:15:13.689","2017-05-02 15:15:36.948","2017-05-02 15:16:21.762",
                                   "2017-05-02 15:21:11.759"), class = "factor"),
  value = structure(c(2L,1L,2L,1L,2L,1L,2L,1L,2L,1L), .Label = c("ON", "OFF"), class = "factor")),
  .Names = c("time","value"), class = "data.frame", row.names = c(NA,-10L))
tab2$time<- as.POSIXct(tab2$time, format = "%Y-%m-%d %H:%M:%S")

tab3 <- structure(list(
  time= structure(1:10, .Label = c("2017-04-27 15:39:35.349","2017-04-28 09:20:08.501","2017-04-28 09:20:25.020",
                                   "2017-04-28 11:30:52.417","2017-04-28 11:30:56.314","2017-04-28 11:33:26.238",
                                   "2017-04-28 11:33:29.545","2017-04-28 14:47:30.948","2017-04-28 14:47:35.278",
                                   "2017-04-28 14:55:54.692"), class = "factor"),
  value = structure(c(2L,1L,2L,1L,2L,1L,2L,1L,2L,1L), .Label = c("OPEN", "CLOSED"), class = "factor")),
  .Names = c("time","value"), class = "data.frame", row.names = c(NA,-10L))
tab3$time<- as.POSIXct(tab3$time, format = "%Y-%m-%d %H:%M:%S")



Au final je souhaiterai les fusionner pour obtenir une seule table tout sans perte d'aucune information sur la date, car à chaque timestamps doit correspondre un événement.
Exemple de la table finale que je souhaite obtenir:

Code : Tout sélectionner

tab=structure(list(
  time= structure(1:13, .Label = c("2017-04-27 15:39:35","2017-04-27 19:39:32","2017-04-28 09:20:08",
                                   "2017-04-28 09:20:13","2017-04-28 09:20:25","2017-04-28 09:20:54",
                                   "2017-04-28 11:30:52","2017-04-28 11:30:56","2017-04-28 11:30:58",
                                   "2017-04-28 11:31:28","2017-04-28 11:32:25","2017-04-28 11:33:26",
                                   "2017-04-28 11:33:29"), class = "factor"),
  capteur1 = structure(c(3L,2L,3L,1L,3L,2L,3L,3L,1L,2L,1L,3L,3L), .Label = c("ON", "OFF","NA"), class = "factor"),
  capteur2 = structure(c(3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L), .Label = c("ON", "OFF","NA"), class = "factor"),
  capteur3 = structure(c(2L,3L,1L,3L,2L,3L,1L,2L,3L,3L,3L,1L,2L), .Label = c("OPEN", "CLOSED","NA"), class = "factor")),
  .Names = c("time","capteur1","capteur2","capteur3"), class = "data.frame", row.names = c(NA,-13L))
Diakaria
Université Claude Bernard Lyon1

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

Re: Optimisation du temps d'exécution

Messagepar Serge Rapenne » 14 Juin 2018, 13:31

Bonjour,

cf la fonction merge

Code : Tout sélectionner

merge(merge(tab1,tab2,by="time",all=T),tab3,by="time",all=T)
                  time value.x value.y  value
1  2017-04-27 15:39:35    <NA>    <NA> CLOSED
2  2017-04-27 19:39:32     OFF    <NA>   <NA>
3  2017-04-28 09:20:08    <NA>    <NA>   OPEN
4  2017-04-28 09:20:13      ON    <NA>   <NA>
5  2017-04-28 09:20:25    <NA>    <NA> CLOSED
6  2017-04-28 09:20:54     OFF    <NA>   <NA>
7  2017-04-28 11:30:52    <NA>    <NA>   OPEN
8  2017-04-28 11:30:56    <NA>    <NA> CLOSED
9  2017-04-28 11:30:58      ON    <NA>   <NA>
10 2017-04-28 11:31:28     OFF    <NA>   <NA>
11 2017-04-28 11:32:25      ON    <NA>   <NA>
12 2017-04-28 11:33:26    <NA>    <NA>   OPEN
13 2017-04-28 11:33:29    <NA>    <NA> CLOSED
14 2017-04-28 11:33:50     OFF    <NA>   <NA>
15 2017-04-28 14:47:30    <NA>    <NA>   OPEN
16 2017-04-28 14:47:35    <NA>    <NA> CLOSED
17 2017-04-28 14:47:42      ON    <NA>   <NA>
18 2017-04-28 14:49:37     OFF    <NA>   <NA>
19 2017-04-28 14:49:46      ON    <NA>   <NA>
20 2017-04-28 14:55:54    <NA>    <NA>   OPEN
21 2017-05-02 15:06:38    <NA>     OFF   <NA>
22 2017-05-02 15:09:13    <NA>      ON   <NA>
23 2017-05-02 15:11:12    <NA>     OFF   <NA>
24 2017-05-02 15:11:45    <NA>      ON   <NA>
25 2017-05-02 15:13:15    <NA>     OFF   <NA>
26 2017-05-02 15:13:18    <NA>      ON   <NA>
27 2017-05-02 15:15:13    <NA>     OFF   <NA>
28 2017-05-02 15:15:36    <NA>      ON   <NA>
29 2017-05-02 15:16:21    <NA>     OFF   <NA>
30 2017-05-02 15:21:11    <NA>      ON   <NA>


ou avec un Reduce

Code : Tout sélectionner

Reduce(function(x, y) merge(x, y, by="time",all=TRUE), list(tab1, tab2, tab3))

Cette solution est meilleur si tu as n data.frame, il suffit de modifier le list(tab1, tab2, tab3)

Serge

Diakaria Korera
Messages : 18
Enregistré le : 07 Juin 2018, 15:51

Re: Optimisation du temps d'exécution

Messagepar Diakaria Korera » 14 Juin 2018, 14:54

Merci Serge pour ta réponse et c'est ce que j'avais fait avec merge (tab1,tab2, all.x=T, all.y=T).
Le gros soucis est que par exemple si deux capteurs envoient des informations aux moments t1="AAAA-MM-JJ HH:MM:SS.07" et t2=t1="AAAA-MM-JJ HH:MM:SS.10", en faisant merge ou Reduce comme tu me l'as suggéré, j'obtiens deux observations différentes, c'est pourquoi j'avais essayé de regrouper tous événements recueille à la ma date, même heure, même minute et même seconde. D'où l'expression "faire la jointure à la second près" que j'avais utilisée plus haut.

Par exemple:
Capteur 1
2018-06-14 16:50:23:10.187 "ON"

Capteur 2
2018-06-14 16:50:23:10.675 "OPEN"

Après fusion, j'aimerai avoir:
time capteur1 capteur2 ...............
2018-06-14 16:50:23:10 "ON" "OPEN" ................

Merci
Diakaria
Université Claude Bernard Lyon1

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

Re: Optimisation du temps d'exécution

Messagepar Logez Maxime » 14 Juin 2018, 15:16

Bonjour,

et en transformant au préalable chaque colonne time avec la fonction as.POSIXct ?

Cordialement,
Maxime

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

Re: Optimisation du temps d'exécution

Messagepar Serge Rapenne » 14 Juin 2018, 15:29

Nous y voilà, tu as donc des dates avec des fractions de secondes, je ne l'avais pas vu car je n'avais pas regardé les données avant le as.POSIXct.
la solution est donc de se débarrasser de ces fractions de secondes avant de faire le merge et là plein de solution :

Code : Tout sélectionner

tab1$time<-as.POSIXct(substr(as.character(tab1$time),1,19))
ou

Code : Tout sélectionner

tab1$time<-as.POSIXct(gsub("\\.[0-9]*$","",as.character(tab1$time)))
ou encore

Code : Tout sélectionner

ab1$time<-as.POSIXct(format(as.POSIXct(tab1$time,),"%Y-%m-%d %H:%M:%S"))


Serge


Retourner vers « Questions en cours »

Qui est en ligne

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