[R] Assigning week numbers

Michael Hosack mhosack9 at hotmail.com
Wed Apr 21 18:50:56 CEST 2010


 
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.
 
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


More information about the R-help mailing list