Re: [Rd] Extract/format/show for S4 objects (Johann Hibschman)

From: Daniel Murphy <chiefmurphy_at_gmail.com>
Date: Wed, 09 Jun 2010 09:21:33 -0700


Johann,

Following up on Gabor's reply, the mondate package (new on CRAN last week) will accomplish your needs.

>I'm trying to make an integer-backed quarter (as in fraction of year)
>class, but I can't quite it to work. I want integer-backed so I don't
>have to worry about floating-point effects when doing math, and so that
>I can use it as in data.table.

mondate represents a date internally as a numeric, not an integer, but the integer part corresponds to months, not years, so a zero fractional part of a mondate corresponds to a "complete month." Every third whole number, therefore, would correspond to a complete quarter. Arithmetic in months (or quarters by dividing by 3) returns a numeric with a "timeunits" attribute. mondate's can be stored in a data.frame.

> (A<-mondate.ymd(2010,3*(1:4))) # display format is "U.S.", my location
mondate: timeunits="months"
[1] 03/31/2010 06/30/2010 09/30/2010 12/31/2010
> diff(A) # 3 months apart
[1] 3 3 3
> A-mondate("12/31/2009") # months since the end of last year; date
input format also works for my location
[1] 3 6 9 12
attr(,"timeunits")
[1] "months"
> c((A-mondate("12/31/2009"))/3) # divide by 3 and remove the attribute and
you have quarters
[1] 1 2 3 4
> data.frame(QtrEnd=A, Amount=rep(1000,4))

      QtrEnd Amount

1 03/31/2010   1000
2 06/30/2010   1000
3 09/30/2010   1000
4 12/31/2010   1000

If the date you are subtracting off is somewhere in the fourth quarter of 2009 but you still want to treat it as being representative of the fourth quarter, the floor function will remove the fractional part of the difference in quarters (I will enter November 1st in non-US format):
> floor(c((A-mondate("2009-11-1"))/3))

[1] 1 2 3 4

>First of all, is there a good reference for this anywhere? All of the
>S4 tutorials that I've found have been too high-level, and I can't find
>any examples of implementing extract. In S3, I can use [.Date as my
>example, but I can't find the equivalent for S4.

See the source code for an S4 "[" method. I was unable to convert all S3 methods to S4, so you will see that some S3 methods remain (e.g., as.data.frame.mondate); S3methods=TRUE in the class definition as a result.

I wrote this package to solve essentially your problem. If it falls short for you somehow, please me know.
Thanks,
- Dan Murphy

        [[alternative HTML version deleted]]



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Wed 09 Jun 2010 - 16:23:18 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Wed 09 Jun 2010 - 17:01:01 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive