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 :

Simplifier une fonction


Sujet :

R

  1. #1
    Candidat au Club
    Femme Profil pro
    Data manager
    Inscrit en
    Juin 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Data manager
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2019
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Simplifier une fonction
    Bonjour,

    J'aurais besoin d'aide pour simplifier une fonction.
    J'aimerais comparer l'identifiant et la date de deux dataframe et faire en sorte que si la date de visite pour un sujet donné du premier dataframe est égale à plus ou moins 15 jours de la date du deuxième dataframe, alors la date de premier df prendre la valeur de celle du second.

    Ce sont des tableaux concernant plusieurs sujet avec une ligne par visite.

    La fonction que j'ai fait fonctionne mais prend vraiment beaucoup de temps et j'aurais aimé savoir s'il est possible de la simplifier.

    Merci d'avance. En me relisant j'ai l'impression que mes explications ne veulent rien dire. J'espère que quelqu'un arrivera a me comprendre

    Mon code :

    Nom : code.PNG
Affichages : 186
Taille : 9,6 Ko

    Voila voila, merci d'avance pour votre aide

  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 Simplifier une fonction
    Bonjour,

    Il est préférable de copier-coller le code et de fournir des dataframes pour le tester.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    df1 <- data.frame(id = c(1,1,1,2,2,2),
                      date = as.Date(c("2017-01-01","2017-02-01","2017-03-01","2018-01-01","2018-02-01","2018-03-01")))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > df1
      id       date
    1  1 2017-01-01
    2  1 2017-02-01
    3  1 2017-03-01
    4  2 2018-01-01
    5  2 2018-02-01
    6  2 2018-03-01
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    df2 <- data.frame(id = c(1,1,1,2,2,2),
                      date = as.Date(c("2017-01-10","2017-02-20","2017-05-01","2018-01-01","2018-02-15","2018-03-01")))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > df2
      id       date
    1  1 2017-01-10
    2  1 2017-02-20
    3  1 2017-05-01
    4  2 2018-01-01
    5  2 2018-02-15
    6  2 2018-03-01
    • Avec votre code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    vec_jour <- c(1:15)
    for (i in 1:nrow(df1)){
      for (j in 1:nrow(df2)){
        for (k in 1:length(vec_jour)){
          if (df1[i,"date"]==df2[j,"date"]+vec_jour[k] | df1[i,"date"]==df2[j,"date"]-vec_jour[k]){
            if (df1[i,"id"]==df2[j,"id"]){
              df1[i,"date"]<-df2[j,"date"]
            }
          }
        }
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > df1
      id       date
    1  1 2017-01-10
    2  1 2017-02-01
    3  1 2017-02-20
    4  2 2018-01-01
    5  2 2018-03-01
    6  2 2018-03-01
    N.B. : L'observation 5 du résultat n'est pas correcte. Dans les propositions qui suivent je suis restée sur votre algorithme. Je n'ai pas cherché à corriger le problème.

    • Vous pouvez vous affranchir de la boucle sur le nombre de jours

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for (i in 1:nrow(df1)){
      for (j in 1:nrow(df2)){
          if (df1[i,"date"]>=df2[j,"date"]-15 & df1[i,"date"]<=df2[j,"date"]+15){
            if (df1[i,"id"]==df2[j,"id"]){
              df1[i,"date"]<-df2[j,"date"]
            }
          }
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > df1
      id       date
    1  1 2017-01-10
    2  1 2017-02-01
    3  1 2017-02-20
    4  2 2018-01-01
    5  2 2018-03-01
    6  2 2018-03-01
    • et d'une des boucles sur les dataframes (conserver celle avec le moins d'itérations, voir cette discussion).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    jmax <- nrow(df2)
    for (j in 1:jmax){
      df1$date <- ifelse((df1$id==df2[j,"id"] & df1$date>=df2[j,"date"]-15 & df1$date<=df2[j,"date"]+15),
                                 df2[j,"date"], df1$date)
    }
    df1$date <- as.Date(df1$date,origin = "1970-01-01")
    df1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > df1
      id       date
    1  1 2017-01-10
    2  1 2017-02-01
    3  1 2017-02-20
    4  2 2018-01-01
    5  2 2018-03-01
    6  2 2018-03-01
    Cordialement,

  3. #3
    Candidat au Club
    Femme Profil pro
    Data manager
    Inscrit en
    Juin 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Data manager
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2019
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Effectivement les résultats 3 et 5 semblent erronés, que ce soit avec ma fonction de départ ou les vôtres.
    Je vais essayer de voir où est le problème.

    En tout cas, merci beaucoup pour votre aide , ça va ma faire gagner un temps précieux !

    Cordialement,

  4. #4
    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 Simplifier une fonction
    Bonjour,

    Le résultat 3 ne me semble pas erroné : 2017-02-20 est 9 jours avant 2017-03-01.

    Cordialement,

  5. #5
    Candidat au Club
    Femme Profil pro
    Data manager
    Inscrit en
    Juin 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Data manager
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2019
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Au temps pour moi, j'ai sauté une ligne, je regardais la date du 2017-05-01

  6. #6
    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 Simplifier une fonction
    Bonjour,

    Le problème du résultat 5 s'explique en exécutant le programme pas à pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    df1 <- data.frame(id = c(1,1,1,2,2,2),
                      date = as.Date(c("2017-01-01","2017-02-01","2017-03-01","2018-01-01","2018-02-01","2018-03-01")))
    df2 <- data.frame(id = c(1,1,1,2,2,2),
                      date = as.Date(c("2017-01-10","2017-02-20","2017-05-01","2018-01-01","2018-02-15","2018-03-01")))
     
    for (j in 1:5){
      df1$date <- ifelse((df1$id==df2[j,"id"] & df1$date>=df2[j,"date"]-15 & df1$date<=df2[j,"date"]+15),
                                 df2[j,"date"], df1$date)
    }
    df1$date <- as.Date(df1$date,origin = "1970-01-01")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > df1
      id       date
    1  1 2017-01-10
    2  1 2017-02-01
    3  1 2017-02-20
    4  2 2018-01-01
    5  2 2018-02-15
    6  2 2018-02-15
    Cordialement,

  7. #7
    Candidat au Club
    Femme Profil pro
    Data manager
    Inscrit en
    Juin 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Data manager
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2019
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup, c'est parfait

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

Discussions similaires

  1. Comment simplifier ce code en une fonction simple ?
    Par roleca dans le forum Langage
    Réponses: 10
    Dernier message: 05/09/2014, 17h31
  2. Comment simplifier l'appel répétitif d'une fonction paramétrée ?
    Par Tendhor57 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 13/03/2013, 08h02
  3. Simplifier une fonction
    Par kOrt3x dans le forum jQuery
    Réponses: 6
    Dernier message: 08/06/2012, 16h39
  4. Simplifier une fonction
    Par Abdellah.alaoui2006 dans le forum Débuter
    Réponses: 3
    Dernier message: 06/03/2010, 12h31
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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