[R] Assigning Week Numbers
Michael Hosack
mhosack9 at hotmail.com
Wed Apr 21 20:49:32 CEST 2010
David, there is still a problem. The data in variable 'wkoffset' should
be equivalent to the data in 'WEEK'. May 07 should begin wkoffset=2 and
the preceeding days should all be assigned wkoffset=1. I did make sure to
adjust the year within day.of.week(). Could you please explain what you
mean by "registration" with a Saturday==1? Maybe that is where the problem
lies.
Thanks,
Mike
--------------------------------------------------------------------------------
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
--------------------------------------------------------------------------------
Previous message: [R] Assigning week numbers
Next message: [R] (no subject)
Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
--------------------------------------------------------------------------------
More information about the R-help mailing list
_________________________________________________________________
Hotmail is redefining busy with tools for the New Busy. Get more from your inbox.
N:WL:en-US:WM_HMP:042010_2
More information about the R-help
mailing list