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)
Bon courage.
Olivier
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"))
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.
cdlt
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
Bonjour,
Je vous remercie de vos réponses . Ca marche à merveille !
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager