[R] How to assign week numbers to a time-series

David Winsemius dwinsemius at comcast.net
Fri Mar 5 22:46:27 CET 2010


On Mar 5, 2010, at 4:23 PM, Hosack, Michael wrote:

> Hello everyone,
>
> My progress has stalled on finding a way of creating a somewhat  
> complicated variable to add to my existing dataframe and I am hoping  
> one of you could help me out. The dataframe below contains only a  
> fraction of the data of my complete dataframe, but all of the  
> variables. What I want to do is add another variable named 'WEEK' to  
> this dataframe that is assigned 1 for row 1 and remains 1 until the  
> first SAT (i.e. Saturday) under variable 'DOW' (day of week) occurs,  
> at which point variable 'WEEK' is now assigned 2. 'WEEK' should  
> continue to be assigned 2 until the following SAT under variable  
> 'DOW' at which variable 'WEEK' will now be assigned 3, and so on. In  
> this scheme, weekdays are such that SAT=1, SUN=2, MON=3,.....FRI=7.  
> I am basically trying to assign week numbers to potential sampling  
> days in a survey season for use in a program that will generate a  
> fisheries creel survey schedule. I should note that if element 1  
> happens to have DOW=SAT (that is the case this year, since!
>  the first day of our survey 05/01 is a Saturday), then WEEK 1  
> begins on day 1 (05/01/2010) and WEEK 2 will begin on the first SAT  
> under variable DOW. I hope I explained this clearly enough, if not  
> let me know. If this sent twice, I apologize.
>
> Mike
>
>         MM DD YR DOW DOW. DTYPE  TOD  TOD. SITENUM       DESC
> 1         05 01 2010 SAT        1     2            MORN    1      
> 101         WALNUT.CK
> 185    05 01 2010 SAT         1     2            MORN    1      
> 102           LAMPE
> 369    05 01 2010 SAT         1     2            MORN    1      
> 103          EAST.AVE
> 553    05 01 2010 SAT         1     2           MORN    1      
> 104          NORTH.EAST
> 737    05 01 2010 SAT         1     2          AFTN       2      
> 101           WALNUT.CK
> 921    05 01 2010 SAT         1     2          AFTN       2      
> 102            LAMPE
> 1105 05 01 2010 SAT          1     2         AFTN       2      
> 103           EAST.AVE
> 1289 05 01 2010 SAT         1     2          AFTN       2      
> 104           NORTH.EAST
> 2        05 02 2010 SUN        2     2          MORN    1      
> 101           WALNUT.CK
> 186   05 02 2010 SUN        2     2          MORN    1      
> 102            LAMPE
> 370   05 02 2010 SUN        2     2          MORN    1      
> 103            EAST.AVE
> 554   05 02 2010 SUN         2     2         MORN    1      
> 104           NORTH.EAST
> 738   05 02 2010 SUN         2     2         AFTN      2      
> 101            WALNUT.CK
> 922   05 02 2010 SUN         2     2          AFTN     2      
> 102              LAMPE
> 1106 05 02 2010 SUN          2     2       AFTN       2      
> 103            EAST.AVE
> 1290 05 02 2010 SUN        2     2          AFTN      2      
> 104            NORTH.EAST
> 3        05 03 2010 MON        3     1        MORN    1      
> 101           WALNUT.CK
> 187   05 03 2010 MON    3     1           MORN    1      
> 102               LAMPE
> 371   05 03 2010 MON      3     1          MORN    1      
> 103           EAST.AVE
> 555   05 03 2010 MON      3     1          MORN    1      
> 104           NORTH.EAST
> 739   05 03 2010 MON    3     1           AFTN      2      
> 101            WALNUT.CK
> 923   05 03 2010 MON      3     1          AFTN      2      
> 102               LAMPE
> 1107 05 03 2010 MON      3     1          AFTN      2      
> 103            EAST.AVE
> 1291 05 03 2010 MON         3     1      AFTN      2      
> 104            NORTH.EAST
> 4        05 04 2010 TUE          4     1         MORN    1      
> 101           WALNUT.CK
> 188   05 04 2010 TUE         4     1           MORN    1      
> 102           LAMPE
> 372   05 04 2010 TUE          4     1        MORN     1      
> 103            EAST.AVE
> .          .    .       .           .           .       .               .            .           .                    .

You could trunc() the results of this function applied to your dates  
and "2010-05-01":

 > diffweek <- function(x,y) {difft <- difftime( x , y)/7; attr(difft,  
"units") <- "weeks"; difft}
 > diffweek(Sys.Date() , as.Date("2010-01-01") )
Time difference of 9 weeks
 > diffweek(Sys.Date()+1 , as.Date("2010-01-01") )
Time difference of 9.142857 weeks

There is also a week function in the tis package.

Perhaps (untested):

dfrm$weeknum <- trunc(apply(dfrm, 1, function(x)  
diffweek(as.Date(x[4], x[2], x[3], sep="-") ,
                                                      
as.Date("2010-05-01")
                                                    )
                       )     )


-- 

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list