IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Comment remplacer une boucle


Sujet :

R

  1. #1
    Candidat au Club
    Femme Profil pro
    statistique
    Inscrit en
    Mai 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : statistique

    Informations forums :
    Inscription : Mai 2017
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Comment remplacer une boucle
    Bonjour,

    je débute sur R et je n'arrive pas résoudre un problème.

    J’ai 2 dataframe :
    • data : dates et heures d’entrée et de sortie de personne sur un mois
    • serie_temps : dates et heures minute par minute sur tous le mois : 2016-12-01 00:00:00 / 2016-12-01 00:01:00 / 2016-12-01 00:02:00 / … / 2016-12-31 23:59:00

    Et je cherche à calculer le nombre de personnes présentes par minute et donc rajouter une colonne à serie_temps
    J’ai pu écrire ce programme qui marche très bien mais qui est très lent… surement à cause de la boucle mais je n’arrive pas à la remplacer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (i in 1:nrow(serie_temps)){ 
      serie_temps[i,2]<-sum(ifelse(data$dateheure_entree<serie_temps[i,1] & data$dateheure_sortie>serie_temps[i,1], 1, 0)) 
    }
    Auriez-vous une idée ?
    Merci +++

  2. #2
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    703
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 703
    Points : 1 311
    Points
    1 311
    Par défaut Comment remplacer une boucle
    Bonjour,

    Votre dataframe serie_temps contenant toutes les minutes sur tous le mois : 2016-12-01 00:00:00 / 2016-12-01 00:01:00 / 2016-12-01 00:02:00 / … / 2016-12-31 23:59:00, cela fait beaucoup d'observations et beaucoup d'itérations. Le dataframe data doit contenir beaucoup moins d'observations et il est préférable alors de faire la boucle sur le dataframe data plutôt que serie_temps. Cela réduira le nombre d'itérations et sera beaucoup plus rapide.

    Sur un petit exemple pour que ce soit plus concret :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    > df1 <- data.frame(id=c(1,2,3,4,5,6),
    +                  deb=c(1,4,3,1,3,2),
    +                  fin=c(4,7,4,10,9,3))
    > df1
      id deb fin
    1  1   1   4
    2  2   4   7
    3  3   3   4
    4  4   1  10
    5  5   3   9
    6  6   2   3
    Boucle sur df2 (serie_temps) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    > df2 <- data.frame(temps=c(1,2,3,4,5,6,7,8,9,10),count=rep(0,10))
    > for (i in 1:nrow(df2)){
    +   df2[i,2] <- sum(ifelse(df1$deb<df2[i,1] & df1$fin>df2[i,1], 1, 0))
    + }
    > df2
       temps count
    1      1     0
    2      2     2
    3      3     2
    4      4     2
    5      5     3
    6      6     3
    7      7     2
    8      8     2
    9      9     1
    10    10     0
    Boucle sur df1 (data) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    > df2 <- data.frame(temps=c(1,2,3,4,5,6,7,8,9,10),count=rep(0,10))
    > for (i in 1:nrow(df1)){
    +   df2$count <- df2$count + ifelse(df1[i,"deb"]<df2$temps & df1[i,"fin"]>df2$temps, 1, 0)
    + }
    > df2
       temps count
    1      1     0
    2      2     2
    3      3     2
    4      4     2
    5      5     3
    6      6     3
    7      7     2
    8      8     2
    9      9     1
    10    10     0
    Je vous laisse adapter le programme à vos données et nous indiquer les temps d'exécution. Vous pouvez chronométrer votre programme à l'aide des fonctions Sys.time() et difftime().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    T1<-Sys.time()
    # programme
    T2<-Sys.time()
    difftime(T2, T1)
    Cordialement,

  3. #3
    Candidat au Club
    Femme Profil pro
    statistique
    Inscrit en
    Mai 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : statistique

    Informations forums :
    Inscription : Mai 2017
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    en effet serie_temps compte 48 961 observations alors que data seulement 772.

    Boucle sur df2 (serie_temps) = 14.16046 mins
    Boucle sur df1 (data) = 6.564832 secs

    y a pas photo !
    Merci +++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/02/2017, 19h46
  2. comment remplacer une boucle PHP par une ligne MySQL ?
    Par dsant dans le forum Requêtes
    Réponses: 2
    Dernier message: 20/09/2010, 19h04
  3. [FTP] comment corriger une boucle infinie ?
    Par sofybj dans le forum Langage
    Réponses: 8
    Dernier message: 08/11/2005, 14h49
  4. Comment faire une boucle ???
    Par HookerSeven dans le forum Access
    Réponses: 6
    Dernier message: 17/06/2005, 12h58
  5. comment remplacer une partie de texte dans un champs
    Par patlapi dans le forum Paradox
    Réponses: 4
    Dernier message: 20/11/2003, 14h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo