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
3 Réponses :
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'))
Voici une solution rapide data.table
df1 <- read.table(text = " ID Date 56 2016-05-22 894 2016-11-09", header = T)
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
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")
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