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 :

Concaténer des dates


Sujet :

R

  1. #1
    Membre à l'essai
    Femme Profil pro
    Etudiant
    Inscrit en
    Juin 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juin 2019
    Messages : 17
    Points : 21
    Points
    21
    Par défaut Concaténer des dates
    Bonjour tous le monde,

    Je souhaite concaténer des variables pour créer une variable date.
    La convention de nommage fait que les noms de variables terminent toujours par _j pour les pour, _m pour les mois et _a pour les année.
    (J'ai mis un fichier d'un exemple simple de données que je peux avoir si vous voulez tester)

    Donc ce que je souhaite faire c'est si le début de la variables _j = début de la variable _m = début de la variable _a alors je créé une nouvelle variable _date.
    Il peut y avoir aussi des dates avec uniquement le mois et l'année (sans le jour).

    ex :
    3 variables :
    visite_j = 10
    visite_m = 06
    visite_a = 1963

    --> DONNE:

    visite_j = 10
    visite_m = 06
    visite_a = 1963
    visite_date = 10/06/1963


    J'ai déjà fait un code qui fonctionne mais qui est très long et pas très beau. Je pense qu'il y a une meilleure méthode mais j'ai un peu du mal à trouver. C'est pour cela que je viens vers vous aujourd'hui. Je vous mets quand même mon code à la suite.

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    tab <- as.data.frame(tab)
     
    i = 0
    taille <- length(tab)
     
    repeat {
     
      i = i + 1
      pre <- regexpr("[^}]+_", names(tab[i]))
      pre <- regmatches(names(tab[i]),pre)
      pre1 <- regexpr("[^}]+_", names(tab[i+1]))
      pre1 <- regmatches(names(tab[i+1]),pre1)
     
      fin <- regexpr("_.+", names(tab[i]))
      fin <- regmatches(names(tab[i]),fin)
      fin1 <- regexpr("_.+", names(tab[i+1]))
      fin1 <- regmatches(names(tab[i+1]),fin1)
     
      if (!identical(pre, character(0)) & !identical(pre1, character(0)) & !identical(fin, character(0))& !identical(fin1, character(0))){
     
        pre2 <- regexpr("[^}]+_", names(tab[i+2]))
        pre2 <- regmatches(names(tab[i+2]),pre2)
        fin2 <- regexpr("_.+", names(tab[i+2]))
        fin2 <- regmatches(names(tab[i+2]),fin2)
     
        if (!identical(fin2, character(0)) & !identical(fin2, character(0))){
          if (pre==pre1 & pre1==pre2){
            if (fin == "_j" & fin1 == "_m" & fin2 == "_a"){
              nom <- paste0(pre,"date")
              tab[,nom] <- paste(tab[,i], tab[,i+1], tab[,i+2], sep="-")
              tab[,nom] <- as.Date(tab[,nom], "%d-%m-%Y")
              i <- i + 2
            }
          }else if (pre == pre1){
            if (fin == "_m" & fin1 == "_a" ){
              nom <- paste0(pre,"date")
              tab[,nom] <- paste(tab[,i], tab[,i+1],sep="-")
              i <- i + 2
            }
          }
        }
        else {
          if (pre == pre1){
            if (fin == "_m" & fin1 == "_a" ){
              nom <- paste0(pre,"date")
              tab[,nom] <- paste(tab[,i], tab[,i+1],sep="-")
              i <- i + 2
            }
          }
        }
      } 
     
      if (i >= taille) break
    }
    Je vous remercie
    Bonne journée

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    bonjour , une solution possible mais avec le tidyverse

    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
    22
    23
    24
    25
    26
    27
    28
    29
     
    library(tidyverse)
    library(glue)
     
    ## tableau de départ
     
    tab <- data.frame(bb=999,
                  visite_j = "10",
                  visite_m = "06",
                  visite_a = "1963",
                  ab_j="15",
                  ab_m="11",  #ab_j=15,
                  ab_a="1960",
                  fg_m="05",
                  fg_a="2000")
     
     
    resultat= tab |> select(matches("_(j|m|a)$")) |>       # selection des cols finissant par_a,m,j
      pivot_longer(everything()) |>          #on pivote tab pour avoir 2 colonnes (name et value)
      separate(name,into = c("nom_date","part_date")) |>         # on scinde name par le "_" 
      # cela donne 2 cols(la première contenant "visite", la deuxieme j ou m ou a)
      mutate(nom_date=glue("{nom_date}_date"),       # on rajoute le suffixe" _date" ("visite"=>"visite_date")
             part_date=factor(part_date,levels=c("j","m","a"))) |>        # on transforme part_dat en factor
      arrange(part_date) |>           # pour trier au cas les variable dans tab était dans le désordre
      ## ex visite_a avant visite_j
      group_by(nom_date) |> # on groupe par nom_date
      summarise( "la_date":=glue_collapse(value,sep="-")) |>        # on calcule pour chaque groupe la date voulue
        pivot_wider(names_from = nom_date,values_from = la_date) |>      # on repivote le tableau
      bind_cols(tab)         # et on "colle" les colonnes du tableau initial

  3. #3
    Membre à l'essai
    Femme Profil pro
    Etudiant
    Inscrit en
    Juin 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juin 2019
    Messages : 17
    Points : 21
    Points
    21
    Par défaut
    Je vous remercie ! Effectivement ce code est plus optimisé et pas si compliqué à comprendre !
    Cependant il ne fonctionne que si il n'y a qu'une ligne dans le tableau. Car s'il y a plusieurs ligne ce code concatène les données de toutes les lignes à chaque fois. (cf pièce jointe)


    De plus, y a-t-il un moyen de mettre les variables _date créées juste après les variables _j, _m, _a correspondantes au lieu de les placer au début du tableau ?
    Images attachées Images attachées  

Discussions similaires

  1. Concaténer des dates et des horaires
    Par the_tiger85 dans le forum Langage
    Réponses: 8
    Dernier message: 20/07/2012, 15h26
  2. Réponses: 12
    Dernier message: 14/10/2011, 21h52
  3. Concaténation des dates
    Par ouadii dans le forum Excel
    Réponses: 1
    Dernier message: 19/09/2007, 10h51
  4. Réponses: 3
    Dernier message: 19/03/2003, 15h19
  5. Fonctions de manipulation des chaines et des dates
    Par Fares BELHAOUAS dans le forum Débuter
    Réponses: 3
    Dernier message: 09/11/2002, 22h43

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