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 :

Retraitement Table décroisement


Sujet :

R

  1. #1
    Membre averti
    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
    Points : 343
    Points
    343
    Par défaut Retraitement Table décroisement
    Bonjour,

    j'ai une table R qui ressemble à celle-ci

    Nom : Sans titre.png
Affichages : 125
Taille : 8,5 Ko

    Et je souhaite obtenir une table qui ressemble à celle-ci s'il vous plait.

    Nom : Sans titr1.png
Affichages : 134
Taille : 7,9 Ko

    Merci d'avance de votre aide

  2. #2
    Membre éclairé
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Points : 793
    Points
    793
    Par défaut
    Tu as la fonction reshape en format direction="long", varying étant les numéros ou les noms des colonnes à éclater et sep, le séparaetur, c'est-à-dire que les noms des colonnes résultantes sont à gauche de ce séparateur. Voir son aide en ligne.

  3. #3
    Membre averti
    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
    Points : 343
    Points
    343
    Par défaut
    ci-joint les données :

    time.xlsx

    J'ai testé ce bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    #Retravaller l'ordre des variables 
     
    time <- colnames(time[,c(1,2,4,6,8,10,12,3,5,7,9,11,13)])
     
    # application 
     
    reshape(data =   time  , direction = 'long' 
            , varying =  c('timeline.Customer_Id' , paste('Status' , 1:6 , sep = ''))
            , sep = "Date_IdStart1" 
    )
    Erreur :

    Error in guess(varying) :
    failed to guess time-varying variables from their names

  4. #4
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    Je n'utilise pas le package {reshape}, je suis plutôt {reshape2} ou {tidyr} pour transposer.
    Une solution avec {reshape2} et un peu de {dplyr}, sans doute largement optimisable...
    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
    library(dplyr) # gestion de données
    library(reshape2) # transposition (melt : de format "large" en "long")
     
    time2 <- time %>% 
      melt(id.vars = "timeline.Customer_Id") %>% 
      mutate(numero = gsub("\\D","",variable)) 
     
    time3 <- time2 %>% 
                filter(grepl("^Status",variable)) %>% 
                inner_join(time2 %>% filter(grepl("^Date_IdStart",variable)),
                           by=c("timeline.Customer_Id","numero")) %>% 
                inner_join(time2 %>% filter(grepl("^Date_IdEnd",variable)),
                           by=c("timeline.Customer_Id","numero")) %>% 
                select(-starts_with("variable"),
                       -numero) %>% 
                rename(status=value.x,
                       start=value.y,
                       end=value) %>% 
                filter(status != "NA") %>% 
                arrange(timeline.Customer_Id)
    John Mount explique ici une solution qui passerait par son package {cdata} et une table qui pilote la transformation de transposition.
    Bon courage.
    Olivier

  5. #5
    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 wideToLong
    Bonjour,

    • La fonction reshape() du package stats indiquée par faubry nécessite de renommer les variables (de même que la fonction fonction wideToLong() du package lsr proposée dans la suite du message).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    > df <- read.csv("time.csv")
    > names(df) <- c("id",
    +                "Status_1","Date_1","Status_2","Date_2",
    +                "Status_3","Date_3","Status_4","Date_4",
    +                "Status_5","Date_5","Status_6","Date_6")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > df
        id   Status_1   Date_1      Status_2   Date_2     Status_3   Date_3      Status_4   Date_4     Status_5   Date_5 Status_6 Date_6
    1 CLI1 Abonnement 20190109          <NA>       NA         <NA>       NA          <NA>       NA         <NA>       NA       NA     NA
    2 CLI2 Abonnement 20180310    Suspension 20180515 Reabonnement 20180813    Suspension 20180911 Reabonnement 20190418       NA     NA
    3 CLI3 Abonnement 20190309          <NA>       NA         <NA>       NA          <NA>       NA         <NA>       NA       NA     NA
    4 CLI4 Abonnement 20170916 Desabonnement 20181213 Reabonnement 20181213 Desabonnement 20190425         <NA>       NA       NA     NA
    5 CLI5 Abonnement 20181215          <NA>       NA         <NA>       NA          <NA>       NA         <NA>       NA       NA     NA
    6 CLI6 Abonnement 20180605          <NA>       NA         <NA>       NA          <NA>       NA         <NA>       NA       NA     NA
    • Fonction reshape()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    df_l <- reshape(data=df, 
                    varying=c("Status_1","Date_1","Status_2","Date_2",
                              "Status_3","Date_3","Status_4","Date_4",
                              "Status_5","Date_5","Status_6","Date_6"), 
                    direction='long', 
                    sep = "_")
    df_l <- df_l[complete.cases(df_l),]
    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
    > df_l
             id time        Status     Date
    CLI1.1 CLI1    1    Abonnement 20190109
    CLI2.1 CLI2    1    Abonnement 20180310
    CLI3.1 CLI3    1    Abonnement 20190309
    CLI4.1 CLI4    1    Abonnement 20170916
    CLI5.1 CLI5    1    Abonnement 20181215
    CLI6.1 CLI6    1    Abonnement 20180605
    CLI2.2 CLI2    2    Suspension 20180515
    CLI4.2 CLI4    2 Desabonnement 20181213
    CLI2.3 CLI2    3  Reabonnement 20180813
    CLI4.3 CLI4    3  Reabonnement 20181213
    CLI2.4 CLI2    4    Suspension 20180911
    CLI4.4 CLI4    4 Desabonnement 20190425
    CLI2.5 CLI2    5  Reabonnement 20190418
    • Le package lsr propose une fonction wideToLong() qui intègre les paramètres qui vont bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > df_l <- lsr::wideToLong(df,"rep")
    > df_l <- df_l[complete.cases(df_l),]
    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
    > df_l
         id rep        Status     Date
    1  CLI1   1    Abonnement 20190109
    2  CLI2   1    Abonnement 20180310
    3  CLI3   1    Abonnement 20190309
    4  CLI4   1    Abonnement 20170916
    5  CLI5   1    Abonnement 20181215
    6  CLI6   1    Abonnement 20180605
    8  CLI2   2    Suspension 20180515
    10 CLI4   2 Desabonnement 20181213
    14 CLI2   3  Reabonnement 20180813
    16 CLI4   3  Reabonnement 20181213
    20 CLI2   4    Suspension 20180911
    22 CLI4   4 Desabonnement 20190425
    26 CLI2   5  Reabonnement 20190418
    • Le package longitudinalData propose aussi une fonction wideToLong().

    Cordialement,

  6. #6
    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 avec le tidyverse et la fonction gather (à tester)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ## time df départ
    time_c <- time %>% gather(status_tempo, STATUS, starts_with("statu")) %>% 
      gather(Date_tempo, Date,starts_with("Date")) %>% 
      select(- ends_with("tempo"))
    cldt

  7. #7
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Points : 561
    Points
    561
    Par défaut
    Bonjour,

    Il n'y a pas besoin de renommer les variables avec reshape. On peut spécifier dans l'argument varying quelles sont les colonnes qui appartiennent à la même variable en indiquant leur position.
    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
    tabl <- reshape(tab, varying = list(seq(2,12,2), seq(3,13,2)), idvar = colnames(tab)[1], direction = "long", v.names = c("Status", "Date"))
    tabl <- tabl[complete.cases(tabl),-2]
    tabl
           timeline.Customer_Id         Status     Date
    CLI1.1                 CLI1     Abonnement 20190109
    CLI2.1                 CLI2     Abonnement 20180310
    CLI3.1                 CLI3     Abonnement 20190309
    CLI4.1                 CLI4     Abonnement 20170916
    CLI5.1                 CLI5     Abonnement 20181215
    CLI6.1                 CLI6     Abonnement 20180605
    CLI2.2                 CLI2     Suspension 20180515
    CLI4.2                 CLI4 Désabonnement 20181213
    CLI2.3                 CLI2  Réabonnement 20180813
    CLI4.3                 CLI4  Réabonnement 20181213
    CLI2.4                 CLI2     Suspension 20180911
    CLI4.4                 CLI4 Désabonnement 20190425
    CLI2.5                 CLI2  Réabonnement 20190418
    cdlt

  8. #8
    Membre averti
    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
    Points : 343
    Points
    343
    Par défaut
    Bonjour,

    Je vous remercie de vos réponses . Ca marche à merveille !

  9. #9
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Juste histoire d'aller au bout de la piste du package {cdata} voici la solution proposée...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    library(cdata)
    numero <- 1:3 # nombre de colonnes Status*
    controle <- data.frame(numero=as.character(numero),
                           status=paste0("Status",numero),
                           start=paste0("Date_IdStart",numero),
                           end=paste0("Date_IdEnd",numero),
                           stringsAsFactors = FALSE)
     
    transfo <- rowrecs_to_blocks_spec(controle, 
                                      recordKeys = "timeline.Customer_Id")
     
    res <- time %.>% transfo
    res <- res[which(res$status != "NA"),]
    Bon courage.
    Olivier

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

Discussions similaires

  1. [LibreOffice][Texte] Table des matièes - retrait negatif après niveaux
    Par hipokamp dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 19/03/2016, 14h19
  2. Jointure entre deux tables et retraitements
    Par tibss dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/05/2012, 11h59
  3. Retraitement d'une table à partir d'une autre
    Par lesguignols dans le forum VBA Access
    Réponses: 2
    Dernier message: 05/01/2009, 23h04
  4. Réparation table/entête endommagée
    Par tbesrour dans le forum Paradox
    Réponses: 15
    Dernier message: 27/11/2007, 10h42
  5. [Table] retraitement de données
    Par Frenchguy dans le forum Access
    Réponses: 2
    Dernier message: 03/01/2007, 22h32

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