[R] Assigning week numbers

David Winsemius dwinsemius at comcast.net
Wed Apr 21 19:15:32 CEST 2010


On Apr 21, 2010, at 12:50 PM, Michael Hosack wrote:

>
>
> I provided a minimized version of my dataframe at the bottom of this  
> message containing the results of David's code in variable  
> ('wkoffset') and Jeff Hallman's code in ('WEEK'). Jeff's code  
> produced the correct results (thank you Jeff) though I have been  
> unable to understand it. David, as you can see your code begins week  
> 2 for year 2011 on a Wednesday, rather than on a Saturday, as it  
> should. Your adjustment seems not to correct the problem, but I  
> concede I may be using it incorrectly. If you are obtaining the  
> correct results please let me know what I am doing wrong.

???

require(chron)
SCHEDULE4$wkoffset <- 2 + as.integer(SCHEDULE4$DATE. -
           as.Date("2011-05-01")- day.of.week(2011, 5, 1) ) %/% 7

 > tail(SCHEDULE4)
           DATE. YEAR MONTH DAY DOW SITE  TOD DOW. wkoffset WEEK
374  2011-05-06 2011     5   6 Fri  103 MORN    7        2    1
1110 2011-05-06 2011     5   6 Fri  103 AFTN    7        2    1
558  2011-05-06 2011     5   6 Fri  104 MORN    7        2    1
1294 2011-05-06 2011     5   6 Fri  104 AFTN    7        2    1
7    2011-05-07 2011     5   7 Sat  101 MORN    1        2    2
743  2011-05-07 2011     5   7 Sat  101 AFTN    1        2    2

I don't know how you are using it, but the "registration" with a  
Saturday==1 seems to be working for me. Perhaps you did not adjust the  
year within day.of.week()?


>
> Thanks,
>
> Mike
>
> Jeff Hallman's code:
>
> weeknumber <- function(aDate){
>    aTi <- ti(aDate, tif = "wfriday")
>    may1ymd <- 10000*year(aTi) + 501
>    baseWeek <- ti(may1ymd, tif = "wfriday")
>    return(aTi - baseWeek + 1)
> }
>
> SCHEDULE3$WEEK<-weeknumber(SCHEDULE3$DATE.)
>
>
>
>
> Thank you David, this approach is a start in the right direction but
>> it does
>> not yield the needed results. I need new week numbers to only begin
>> on Saturdays. The only exception will be for the first date (May 01)
>> which will start week 1 on a different day of the week depending on
>> the year. The proceeding Saturday will begin Week #2. The approach  
>> you
>> provided does not end Week 1 on a Friday and does not end subsequent
>> week #'s on Fridays.
>
> My solution should be adjustable for any day-of-week ending number.
> Why don't you provide a minimal example for testing and show how apply
> my solution fails? Your original version was definitely not "minimal."
> -- 
> David.
>>
>> Thanks again,
>>
>> Mike
>>
>> ----------------------------------------
>>> CC: mhosack9 at hotmail.com; r-help at r-project.org
>>> From: dwinsemius at comcast.net
>>> To: dwinsemius at comcast.net
>>> Subject: Re: [R] Assigning Week Numbers
>>> Date: Tue, 20 Apr 2010 16:03:09 -0400
>>>
>>>
>>> On Apr 20, 2010, at 2:55 PM, David Winsemius wrote:
>>>
>>>>
>>>> On Apr 20, 2010, at 1:59 PM, Michael Hosack wrote:
>>>>
>>>>>
>>>>> R experts,
>>>>>
>>>>> How could I extract the week number from a date vector (in Date
>>>>> class)
>>>>> such that week numbering (week 1...2...) begins (May 01) and ends
>>>>> (October 31) on the same specific dates each year? Week numbering
>>>>> must conform to the following day numbering format
>>>>> (Sat=1,Sun=2,Mon=3.....Fri=7).
>>>>> This means that new weeks must begin on Saturdays, and end on
>>>>> Fridays
>>>>> (except for the first date of May 01, which always begins week 1;
>>>>> week 2
>>>>> begins on the proceeding Saturday). This needs to be applicable
>>>>> across years
>>>>> to work effectively. I have tried using both vectorized and loop
>>>>> approaches with
>>>>> no success.
>>>>>
>>>>
>>>> Modulo arithmetic will work if you first convert the difftime  
>>>> object
>>>> to integer:
>>>
>>> And you can use teh chron function day.of.week to return an offset
>>> for
>>> the first week
>>>
>>>> weekdays(as.Date("2013-05-01") )
>>> [1] "Wednesday"
>>>> day.of.week(2013, 5, 1)
>>> [1] 5
>>>> SCHEDULE3$wkoffset <- as.integer(SCHEDULE3$DATE. -
>>> as.Date("2013-05-01")- day.of.week(2013, 5, 1) ) %/% 7
>>>> range(SCHEDULE3$wkoffset)
>>> [1] -1 25
>>> # So you need a further adjustment of 2 to set the starting week
>>> number to "1":
>>>
>>>> SCHEDULE3$wkoffset <- 2+as.integer(SCHEDULE3$DATE. -
>>> as.Date("2013-05-01")- day.of.week(2013, 5, 1) ) %/% 7
>>>> range(SCHEDULE3$wkoffset)
>>> [1] 1 27
>>>
>>>>
>>>>> SCHEDULE3$wkoffset <- as.integer(SCHEDULE3$DATE. -
>>>> as.Date("2010-05-01") ) %/% 7
>>>>> str(head(SCHEDULE3))
>>>> 'data.frame': 6 obs. of 9 variables:
>>>> $ DATE. :Class 'Date' int [1:6] 15826 15826 15826 15826 15826 15826
>>>> $ YEAR : num 2013 2013 2013 2013 2013 ...
>>>> $ MONTH : num 5 5 5 5 5 5
>>>> $ DAY : num 1 1 1 1 1 1
>>>> $ DOW : chr "Wed" "Wed" "Wed" "Wed" ...
>>>> $ SITE : num 101 101 102 102 103 103
>>>> $ TOD : Factor w/ 2 levels "MORN","AFTN": 1 2 1 2 1 2
>>>> $ DOW. : num 5 5 5 5 5 5
>>>> $ wkoffset: num 156 156 156 156 156 156
>>>>> range(SCHEDULE3$DATE.)
>>>> [1] "2013-05-01" "2013-10-31"
>>>>> range(SCHEDULE3$wkoffset)
>>>> [1] 156 182
>>>>
>>>>> I am including a bit of old Systat code that does the trick simply
>>>>> and concisely.
>>>>> If anyone knows an analogous method in R please let me know. My R
>>>>> dataframe contains
>>>>> all the variables and data in the Systat temp file.
>>>>>
>>>>> Use sched3.t
>>>>> Save sched4.t
>>>>> Hold
>>>>> By mm dd
>>>>> If bof then let week=1
>>>>> Else if bog and DOW$="SAT" then let week = week + 1
>>>>> Run
>>>>>
>>>>>
>>>>> Thank you,
>>>>>
>>>>> Mike
>>>>>
>>>>>
>>>>> SCHEDULE3 <-
>>>>> structure(list(DATE. = structure(c(15826L, 15826L, 15826L, 15826L,
>>
> snipped the rather larger than minimal example.
> David Winsemius, MD
> West Hartford, CT
>
>
>
>
> This is about as minimal as I could get it.
>
> SCHEDULE4 <-
> structure(list(DATE. = structure(c(15095L, 15095L, 15095L, 15095L,
> 15095L, 15095L, 15095L, 15095L, 15096L, 15096L, 15096L, 15096L,
> 15096L, 15096L, 15096L, 15096L, 15097L, 15097L, 15097L, 15097L,
> 15097L, 15097L, 15097L, 15097L, 15098L, 15098L, 15098L, 15098L,
> 15098L, 15098L, 15098L, 15098L, 15099L, 15099L, 15099L, 15099L,
> 15099L, 15099L, 15099L, 15099L, 15100L, 15100L, 15100L, 15100L,
> 15100L, 15100L, 15100L, 15100L, 15101L, 15101L), class = "Date"),
>    YEAR = c(2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011,
>    2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011,
>    2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011,
>    2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011,
>    2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011,
>    2011, 2011), MONTH = c(5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
>    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
>    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5),
>    DAY = c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3,
>    3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5,
>    5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7), DOW = c("Sun",
>    "Sun", "Sun", "Sun", "Sun", "Sun", "Sun", "Sun", "Mon", "Mon",
>    "Mon", "Mon", "Mon", "Mon", "Mon", "Mon", "Tue", "Tue", "Tue",
>    "Tue", "Tue", "Tue", "Tue", "Tue", "Wed", "Wed", "Wed", "Wed",
>    "Wed", "Wed", "Wed", "Wed", "Thu", "Thu", "Thu", "Thu", "Thu",
>    "Thu", "Thu", "Thu", "Fri", "Fri", "Fri", "Fri", "Fri", "Fri",
>    "Fri", "Fri", "Sat", "Sat"), SITE = c(101, 101, 102, 102,
>    103, 103, 104, 104, 101, 101, 102, 102, 103, 103, 104, 104,
>    101, 101, 102, 102, 103, 103, 104, 104, 101, 101, 102, 102,
>    103, 103, 104, 104, 101, 101, 102, 102, 103, 103, 104, 104,
>    101, 101, 102, 102, 103, 103, 104, 104, 101, 101), TOD =  
> structure(c(1L,
>    2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L,
>    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L,
>    2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L,
>    1L, 2L, 1L, 2L), .Label = c("MORN", "AFTN"), class = "factor"),
>    DOW. = c(2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
>    4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6,
>    6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1), wkoffset = c(1,
>    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
>    1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
>    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), WEEK = c(1, 1, 1, 1, 1,
>    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
>    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
>    1, 1, 1, 1, 1, 2, 2)), .Names = c("DATE.", "YEAR", "MONTH",
> "DAY", "DOW", "SITE", "TOD", "DOW.", "wkoffset", "WEEK"), row.names  
> = c(1L,
> 737L, 185L, 921L, 369L, 1105L, 553L, 1289L, 2L, 738L, 186L, 922L,
> 370L, 1106L, 554L, 1290L, 3L, 739L, 187L, 923L, 371L, 1107L,
> 555L, 1291L, 4L, 740L, 188L, 924L, 372L, 1108L, 556L, 1292L,
> 5L, 741L, 189L, 925L, 373L, 1109L, 557L, 1293L, 6L, 742L, 190L,
> 926L, 374L, 1110L, 558L, 1294L, 7L, 743L), class = "data.frame") 		  
> 	   		
> _________________________________________________________________
> Hotmail has tools for the New Busy. Search, chat and e-mail from  
> your inbox.
>
> N:WL:en-US:WM_HMP:042010_1
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list