2015-07-16 5 views
3

Я пытаюсь создать последовательность недель, которые повторяются каждый месяц.Создайте последовательность из тех же недель каждый месяц в R

Я создал последовательность в течение одного месяца, очевидно, но я хотел бы, чтобы эта последовательность была одинаковой для каждого месяца.

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

Который дает мне:

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

Я хочу что-то вроде этого:

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

Последовательность должна идти до 2014

Любая помощь будет большим.

+0

возможный дубликат [Создание четырех отдельных недель за каждый календарный месяц в R] (http://stackoverflow.com/questions/31238654/creating-four-separate-weeks- for-every-calendar-month-in-r) –

+0

Удача, связанная с високосными годами :-) –

+0

@SAMIR SULTANI, как ваш запрос отличается от того, что вы ранее задавали (так как Паскаль связан с выше)? –

ответ

1

Мы можем создать вектор последовательности «Даты» ('v1'), split векторный код на основе month и year. Используйте lapply, чтобы перебрать список и удалить часть дня и paste со дня первых четырех наблюдений (извлечен с использованием 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" 

Или другой вариант был бы

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

По какой-то причине я получаю следующую ошибку: Ошибка в split.default (unclass (x), f, drop = drop): не удалось найти функцию «месяц» –

+0

@SAMIRSULTANI Извините, я загрузил пакет 'data.table 'Он также находится в' lubridate'. Но вы можете выделить месяц с 'format (v1, '% m')' и year с 'format (v1, '% Y')' – akrun

+0

Да, похоже, это трюк ... Привет. Итак, начальная последовательность была разделена на месяцы и годы, чтобы определить шаблон да? –

0

'timeDate' библиотечный может быть полезным. Она имеет функцию «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)) 
    } 
    } 
}