2 votes

Comment créer une séquence de jours dans dplyr ?

J'ai un jeu de données qui ressemble à ceci :

dt <- structure(list(servicerequestid = c("254475", "255470", "249438", 
"249398", "249399"), createdate = structure(c(1471592400, 1471874280, 
1470037140, 1470028740, 1470031020), tzone = "UTC", class = c("POSIXct", 
"POSIXt")), closedate = structure(c(1473661860, 1472457480, 1470641700, 
1491918180, 1470293940), tzone = "UTC", class = c("POSIXct", 
"POSIXt"))), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-5L), .Names = c("servicerequestid", "createdate", "closedate"
))

# A tibble: 5 x 3
  servicerequestid          createdate           closedate
             <chr>              <dttm>              <dttm>
1           254475 2016-08-19 07:40:00 2016-09-12 06:31:00
2           255470 2016-08-22 13:58:00 2016-08-29 07:58:00
3           249438 2016-08-01 07:39:00 2016-08-08 07:35:00
4           249398 2016-08-01 05:19:00 2017-04-11 13:43:00
5           249399 2016-08-01 05:57:00 2016-08-04 06:59:00

Chaque servicerequestid est l'identifiant d'une demande de service qui est restée ouverte à partir de createdate a closedate . J'aimerais transformer cet ensemble de données de telle sorte que chaque servicerequestid aura autant d'observations que de jours où le ticket est resté ouvert, avec sa date respective.

Par exemple, pour les servicerequestid== 255470 l'ensemble de données ressemblerait à ce qui suit :

# A tibble: 8 x 2
  servicerequestid       date
             <dbl>     <date>
1           255470 2016-08-22
2           255470 2016-08-23
3           255470 2016-08-24
4           255470 2016-08-25
5           255470 2016-08-26
6           255470 2016-08-27
7           255470 2016-08-28
8           255470 2016-08-29

J'ai essayé le code ci-dessous, mais il ne fonctionne pas :

dt %>%
  mutate(seq.Date(as.Date(createdate), as.Date(closedate), by="days"))

Quelques éléments de contexte : J'essaie de créer une carte de densité animée dans ggplot, et j'ai pensé qu'une approche possible pourrait être de créer des observations quotidiennes. De cette façon, pour chaque jour, je devrais être en mesure de visualiser le nombre de tickets ouverts.

6voto

lukeA Points 39689

Voici une façon de procéder :

library(tidyverse)
dt %>%
  mutate_if(~inherits(.x, "POSIXct"), as.Date) %>% # convert posix cols to date
  gather(var, date, -1) %>%                        # wide to long format 
  select(-var) %>%                                 # we don't need this 
  group_by(servicerequestid) %>%                   # for every id...
  expand(date = full_seq(date, 1)) %>%             # create the date range
  filter(servicerequestid == 255470)               # Then grab the example one
# # A tibble: 8 x 2
# # Groups: servicerequestid [1]
# servicerequestid date      
# <chr>            <date>    
# 1 255470           2016-08-22
# 2 255470           2016-08-23
# 3 255470           2016-08-24
# 4 255470           2016-08-25
# 5 255470           2016-08-26
# 6 255470           2016-08-27
# 7 255470           2016-08-28
# 8 255470           2016-08-29

2voto

www Points 27760

Autre tidyverse solution.

library(tidyverse)
dt2 <- dt %>%
  mutate_at(vars(ends_with("date")), funs(as.Date)) %>%            # Convert date time class to date class
  mutate(date = map2(createdate, closedate, seq.Date, by = 1)) %>% # Create a list column with dates
  unnest() %>%                                                     # Expand based on the list column
  select(servicerequestid, date) %>%                               # Select the desired columns
  filter(servicerequestid == 255470)                               # Filter for servicerequestid 255470
dt2
# # A tibble: 8 x 2
#   servicerequestid       date
#              <chr>     <date>
# 1           255470 2016-08-22
# 2           255470 2016-08-23
# 3           255470 2016-08-24
# 4           255470 2016-08-25
# 5           255470 2016-08-26
# 6           255470 2016-08-27
# 7           255470 2016-08-28
# 8           255470 2016-08-29

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X