Bonjour,
j'ai une table R qui ressemble à celle-ci
Et je souhaite obtenir une table qui ressemble à celle-ci s'il vous plait.
Merci d'avance de votre aide![]()
Bonjour,
j'ai une table R qui ressemble à celle-ci
Et je souhaite obtenir une table qui ressemble à celle-ci s'il vous plait.
Merci d'avance de votre aide![]()
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.
ci-joint les données :
time.xlsx
J'ai testé ce bout de code :
Erreur :
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" )
Error in guess(varying) :
failed to guess time-varying variables from their names
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...John Mount explique ici une solution qui passerait par son package {cdata} et une table qui pilote la transformation de transposition.
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)
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")• Fonction reshape()
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
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),]• 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
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
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),]• Le package longitudinalData propose aussi une fonction wideToLong().
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
Cordialement,
bonjour une solution avec le tidyverse et la fonction gather (à tester)
cldt
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"))
Partager