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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Retraitement Table décroisement
    Bonjour,

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

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

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

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

    Merci d'avance de votre aide

  2. #2
    Membre émérite
    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
    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 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
    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 : 48
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    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.

  5. #5
    Membre Expert
    Inscrit en
    Novembre 2009
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 707
    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 émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    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

+ 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