2017-05-30 3 views
0

J'essaie d'identifier la date de début et la date de fin 2 intervalles différents.Calculer les intervalles de date et le nombre de jours dans une boucle

Chaque intervalle est défini comme:

  • minimum: la date min de ma df.
  • max: la date max moins un certain décalage fixe (1,2,3 semaines)

Pour deux simples décalages je l'ai écrit:

df <- sample(seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day"), 150) 
dates <- as.data.frame(df) 


end_1week <- max(df) - weeks(1) 
min <- min(df) 


end_2week <- max(df) - weeks(2) 
min <- min(df) 

print(paste('Sample 1 starts from',min,'to', end_1week)) 
print(paste('Sample 2 starts from',min,'to', end_2week)) 

Comment puis-je vectoriser cette procédure pour un nombre arbitraire de décalages? Disons que la définition d'un:

lags <- (1,2,4,8,12) 

et imprimer chaque échantillon date de début et de fin, en ajoutant le nombre de jours dans chaque échantillon?

+0

Pouvez-vous fournir des données reproductibles par exemple? – www

+0

j'ai édité avec quelques données aléatoires @ycw – xxxvinxxx

+0

semaines est indéfini –

Répondre

1

Cela pourrait vous donner la sortie que vous recherchez

library(lubridate) 

df <- sample(seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day"), 150) 
dates <- as.data.frame(df) 

lags <- c(1,2,4,8,12) 
min <- min(df) 
end_weeks <- max(df) - weeks(lags) 

print(paste('Sample',lags,'starts from',min,'to',end_weeks)) 
+0

'semaines 'est une fonction' lubrifier', il vous permet de manipuler les dates par des intervalles de semaine. lubridate inclut également des fonctions similaires à celle-ci pour les secondes, minutes, heures, jours ... etc –

+0

Bon point @ycw J'ai mis à jour ma réponse pour qu'elle soit une version vectorisée plutôt que traitée par une boucle for. –