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 :

Comparaison de dates entre deux data frame de longueurs différents


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 2
    Par défaut Comparaison de dates entre deux data frame de longueurs différents
    Bonjour,

    Depuis hier je suis bloqué sur cette question.

    J'ai en fait un 1er data frame comportant une colonne date (du 1er janvier à fin mai par exemple) et un second data frame comprenant une colonne date pour des périodes de vacances (nom_vacance, date_début, date_fin).

    Je cherche en fait à ajouter une colonne dans mon 1er data frame qui fait que lorsque la date est compris entre les date de mon data frame vacance, il soit écris vacance et sinon normal.

    J'avais imaginé quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    periode$dataframe1=ifelse( date$dataframe1 >= date_début$dataframe2 & date$dataframe1<=date_fin$dataframe2, vacance, normal)
    Mais bien sûr cela ne marche pas vu qu'il fait une comparaison ligne par ligne.

    Je voudrais avoir un résultat final comme ceci :

    date période
    01/01/2018 vacance
    02/01/2018 vacance
    03/01/2018 normal
    04/01/2018 normal
    05/01/2018 normal
    ........

    Merci de l'aide que vous saurez m'apporter

  2. #2
    Membre expérimenté
    Homme Profil pro
    Data scientist
    Inscrit en
    Février 2017
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data scientist
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2017
    Messages : 211
    Par défaut
    Je vous propose ce code:

    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
    17
     
     
    #créer une table de la période souhaiter ici du 1/1/2018 au 1/3/2018
    data1 =  data.frame( date = seq.Date( from = as.Date("2018/1/1"), to = as.Date("2018/3/1"),by = "day"))
    # j'ai simulé un fichier vacances avec le même format que le votre.
    data2 = data.frame( vac = c('vac1' , 'vac2') , 
                        debut = c(as.Date("2018/01/20"),as.Date("2018/2/2")) , 
                        fin = c(as.Date("2018/01/25"), as.Date("2018/02/10")))
    # je crée une table intermédiaire  ( je considère que la table vacance est trié par date de début ) il faut le trier si c'est pas le cas
    v = seq.Date(data2$debut[1], data2$fin[1], by = 'day')
    for( i in 2:nrow(data2)){v =  c( v , seq.Date(data2$debut[i], data2$fin[i], by = 'day') )}
    data3 = data.frame( date = v, vac = rep("Vacance",length(v)))
     
    # étape finale
    require(sqldf)
    tablefinale = sqldf( " select a.* , case when b.vac is null then 'normal' else b.vac end as vac
    from data1 as a left join data3 as b on a.date = b.date")

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 2
    Par défaut
    Oh géniale @marou1991, la ligne de code avec seq.Date vient de me sauver.

    J'ai repris ton code à quelques détails près. (déjà en fait j'ai un dataframe vacance pour les dates de vacances et un dataframe été pour les jours d'été, les deux qui devaient être identifié dans mon 1er dataframe qui s'appelle ici "donnees")
    J'ai fais comme ceci :


    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
    17
    18
    19
    20
    21
    vac$debut_vac=dmy(vac$debut_vac)
    vac$fin_vac=dmy(vac$fin_vac)
     
    ete$debut_ete=dmy(ete$debut_ete)
    ete$fin_ete=dmy(ete$fin_ete)
     
    v = seq.Date(vac$debut_vac[1], vac$fin_vac[1], by = 'day')
    for( i in 2:nrow(vac)){v =  c( v , seq.Date(vac$debut_vac[i], vac$fin_vac[i], by = 'day') )}
    new = data.frame( date = v, periode = rep("PVS",length(v)))
     
    e= seq.Date(ete$debut_ete[1], ete$fin_ete[1], by = 'day')
    for( i in 2:nrow(ete)){e =  c( e , seq.Date(ete$debut_ete[i], ete$fin_ete[i], by = 'day') )}
    new2 = data.frame( date = e, periode = rep("été",length(e))) 
     
    calendrier=rbind(new,new2)
     
    calendrier$date=ymd(calendrier$date)
     
    donnees$periode=ifelse(donnees$date%in%calendrier$date,calendrier$periode,"PS")
     
    donnees$periode=factor(donnees$periode, labels=c("PVS","été","PS"))

    Le seul hic a été ici pour moi le fait que ça identifiait 1 et 2 au lieu de "PVS" et "été" et donc je devais rajouter une ligne de code pour les labels.

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

Discussions similaires

  1. Manipulations par spin button entre deux data frame
    Par argonath dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/07/2009, 17h30
  2. Comparaison de données entre deux arrays
    Par sironimo dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 20/04/2006, 17h44
  3. [Oracle 9] Une date entre deux dates !
    Par jf-nigou dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/04/2006, 10h45
  4. [VB6]sortir toutes les dates entre deux dates
    Par AlfiQue dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/02/2006, 19h09
  5. [Dates] Comparaison de date entre deux IP (anti-flood)
    Par psychoBob dans le forum Langage
    Réponses: 79
    Dernier message: 23/12/2005, 17h19

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