On Apr 21, 2010, at 1:15 PM, David Winsemius wrote:


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

Bad code. I thought the order of arguments to day.of.week would match the POSIX convention, but it is really month, day, year. Even if I were on target with the arguments, I would have needed to have a different adjustment to get the modulo arithmetic working correctly:

> dseq <- as.Date("2011-05-01") + (-4:14)
> dseq
[1] "2011-04-27" "2011-04-28" "2011-04-29" "2011-04-30" "2011-05-01" "2011-05-02" [7] "2011-05-03" "2011-05-04" "2011-05-05" "2011-05-06" "2011-05-07" "2011-05-08" [13] "2011-05-09" "2011-05-10" "2011-05-11" "2011-05-12" "2011-05-13" "2011-05-14"
[19] "2011-05-15"

> data.frame(dseq, wk= 1+ as.integer(dseq - as.Date("2011-05-01")- day.of.week(5, 1, 2011) +1) %/% 7)
         dseq wk
1  2011-04-27  0
2  2011-04-28  0
3  2011-04-29  0
4  2011-04-30  1
5  2011-05-01  1
6  2011-05-02  1
7  2011-05-03  1
8  2011-05-04  1
9  2011-05-05  1
10 2011-05-06  1
11 2011-05-07  2
12 2011-05-08  2
13 2011-05-09  2
14 2011-05-10  2
15 2011-05-11  2
16 2011-05-12  2
17 2011-05-13  2
18 2011-05-14  3
19 2011-05-15  3

So the week counter does now change on a Saturday.

--
David




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

Only because I was looking a the wrong column. Arrrgghh.

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
______________________________________________
[email protected] 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

______________________________________________
[email protected] 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

______________________________________________
[email protected] 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.

Reply via email to