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 ______________________________________________ R-help@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.