2015-07-16 1 views
3

J'essaie de générer une séquence de semaines qui se répète pour chaque mois.Générer une séquence des mêmes semaines chaque mois dans R

J'ai créé la séquence pour un mois évidemment, mais j'aimerais que cette séquence soit la même pour tous les mois.

sequence2 <- format(seq(as.Date("2004-01-01"), as.Date("2004-01-23"), by = "week"), "%Y-%m-%d") 

Ce qui me donne:

sequence2 
[1] "2004-01-01" "2004-01-08" "2004-01-15" "2004-01-22" 

Je veux quelque chose comme ceci:

"2004-01-01" "2004-01-08" "2004-01-15" "2004-01-22" 
"2004-02-01" "2004-02-08" "2004-02-15" "2004-02-22" 
. 
. 
. 

La séquence devrait aller jusqu'à 2014

Toute aide serait grande.

+0

double possible de [Créer quatre semaines distinctes pour chaque mois civil en R] (http://stackoverflow.com/questions/31238654/creating-four-separate-weeks- –

+0

Bonne chance pour faire face aux années bissextiles :-) –

+0

@SAMIR SULTANI, en quoi votre requête est-elle différente de ce que vous avez demandé précédemment (en lien avec Pascal ci-dessus)? –

Répondre

1

Nous pourrions créer un vecteur de 'Dates' sequence ('v1'), split en utilisant le vecteur de month et year. Utilisez lapply pour boucler la liste et supprimer la partie de jour et paste avec le jour des quatre premières observations (extrait en utilisant substr).

library(lubridate) 
v1 <- seq(as.Date("2004-01-01"), as.Date("2014-01-23"), by = "week") 
lst <- split(v1, list(month(v1), year(v1)), drop=TRUE) 
days <- substr(v1[1:4],9,10) 
v2 <- unlist(lapply(lst, function(x) { 
    sprintf('%s%s', substr(x[1:4], 1,8), days)}), use.names=FALSE) 
v2[1:8] 
#[1] "2004-01-01" "2004-01-08" "2004-01-15" "2004-01-22" "2004-02-01" 
#[6] "2004-02-08" "2004-02-15" "2004-02-22" 
tail(v2,8) 
#[1] "2013-12-01" "2013-12-08" "2013-12-15" "2013-12-22" "2014-01-01" 
#[6] "2014-01-08" "2014-01-15" "2014-01-22" 

Ou une autre option serait

v1 <- seq(as.Date('2004-01-01'), length.out=4, by = 'week') 
len <- 4*12*10 + 4 
v2 <- rep(v1, len/4) 
v3 <- do.call(paste, c(d1[do.call(order, d1),][1:484,-3], sep="-")) 
res <- paste0(v3, sub('^\\d+-\\d+', '', v2)) 
head(res,8) 
#[1] "2004-01-01" "2004-01-08" "2004-01-15" "2004-01-22" "2004-02-01" 
#[6] "2004-02-08" "2004-02-15" "2004-02-22" 
tail(res,8) 
#[1] "2013-12-01" "2013-12-08" "2013-12-15" "2013-12-22" "2014-01-01" 
#[6] "2014-01-08" "2014-01-15" "2014-01-22" 
+0

Pour une raison quelconque j'obtiens l'erreur suivante: Erreur dans split.default (unclass (x), f, drop = drop): impossible de trouver la fonction "mois" –

+0

@SAMIRSULTANI Désolé, j'ai chargé le paquet 'data.table 'Il est aussi dans' lubrifier '. Mais, vous pouvez extraire le mois avec 'format (v1, '% m')' et l'année avec 'format (v1, '% Y')' – akrun

+0

Ouais cela semble faire l'affaire ... Cheers. Donc, essentiellement, la séquence initiale a été divisée en mois et en années pour identifier le modèle oui? –

0

'timedate' La bibliothèque pourrait être utile. Il a une fonction 'timeCalendar':

library(timeDate) 

t <- matrix(NA,0,4) 

for (year in 2001:2004) 
{ 
    for (month in 1:12) 
    { 
    t <- rbind(t,rep(NA,4)) 

    for (i in 0:3) 
    { 
     t[nrow(t),i+1] <- as.character(timeCalendar(y = year, 
                m = month, 
                d = 7*i+1)) 
    } 
    } 
}