2
votes

Créer une fenêtre de temps autour d'une date

Je souhaite créer une fenêtre horaire autour d'une date donnée. D'autres questions se sont centrées sur la date de début et de fin, la seule chose que j'ai est une date autour de laquelle je voudrais créer une fenêtre. Actuellement, j'ai un df avec plusieurs dates et un identifiant, je voudrais créer des fenêtres horaires autour des dates allant de -2 à +2. Le résultat doit être stocké dans un format df afin que je puisse y joindre les valeurs d'un autre df. L'ensemble de données réel est beaucoup plus volumineux, donc saisir manuellement les dates de début et de fin pour tous les ID n'est pas vraiment une option.

ID      date
56      2016-05-20
56      2016-05-21
56      2016-05-22
56      2016-05-23
56      2016-05-24
894     2016-11-07
894     2016-11-08
894     2016-11-09
894     2016-11-10
894     2016-11-11 

se terminant par un df similaire à ci-dessous

df1 = 
ID    Date
56   2016-05-22
894  2016-11-09


0 commentaires

3 Réponses :


1
votes

Nous pouvons utiliser complete de tidyr ce qui facilite la réalisation de séquences, c'est-à-dire

# A tibble: 10 x 2
# Groups:   ID [2]
      ID Date      
   <int> <date>    
 1    56 2016-05-20
 2    56 2016-05-21
 3    56 2016-05-22
 4    56 2016-05-23
 5    56 2016-05-24
 6   894 2016-11-07
 7   894 2016-11-08
 8   894 2016-11-09
 9   894 2016-11-10
10   894 2016-11-11

ce qui donne,

library(tidyverse)

df %>% 
 mutate(Date = as.Date(Date)) %>% 
 group_by(ID) %>% 
 complete(Date = seq.Date((Date-2), (Date+2), by = 'days'))


0 commentaires

2
votes

Voici une solution rapide data.table

df1 <- read.table(text = " ID    Date
56   2016-05-22
894  2016-11-09", header = T)

Exemple de données

library(data.table)
setDT(df1)[, .(date = seq(as.Date(Date) - 2, as.Date(Date) + 2, 1)), by = ID]
#     ID       date
# 1:  56 2016-05-20
# 2:  56 2016-05-21
# 3:  56 2016-05-22
# 4:  56 2016-05-23
# 5:  56 2016-05-24
# 6: 894 2016-11-07
# 7: 894 2016-11-08
# 8: 894 2016-11-09
# 9: 894 2016-11-10
#10: 894 2016-11-11


0 commentaires

1
votes

Une option base R serait de parcourir la colonne 'Date', d'obtenir la séquence dans une liste , puis de rep licate le 'ID' basé sur les longueurs de 'list' pour créer un nouveau 'data.frame' tout en concaténant les éléments list

df1 <- structure(list(ID = c(56L, 894L), Date = structure(c(16943, 17114
 ), class = "Date")), row.names = c(NA, -2L), class = "data.frame")

données

lst1 <- lapply(df1$Date, function(x) seq(x-2, x+2, by = '1 day'))
data.frame(ID = rep(df1$ID, lengths(lst1)), date = do.call(c, lst1))
#    ID       date
#1   56 2016-05-20
#2   56 2016-05-21
#3   56 2016-05-22
#4   56 2016-05-23
#5   56 2016-05-24
#6  894 2016-11-07
#7  894 2016-11-08
#8  894 2016-11-09
#9  894 2016-11-10
#10 894 2016-11-11


0 commentaires