Re: [R] Confusion with sapply

From: Gabor Grothendieck <ggrothendieck_at_gmail.com>
Date: Wed, 13 Jun 2007 09:23:03 -0400

Try this. It takes a Date class date and in the first line month.day.year converts unclass(x) to chron. In the last line of the function we convert back to Date class. Its already vectorized so sapply is unneeded:

library(chron)
f <- function(x) with(month.day.year(unclass(x)), {

	month <- ifelse(month == 6 | month == 9, 3, month)
	year <- ifelse(month == 12, year + 1, year)
	as.Date(paste(year, month, day, sep = "-"))
})

Running the last line gives:

> # test
> f(seq(Sys.Date(), length = 12, by = "month"))

 [1] "2007-03-13" "2007-07-13" "2007-08-13" "2007-03-13" "2007-10-13"
 [6] "2007-11-13" "2008-12-13" "2008-01-13" "2008-02-13" "2008-03-13"
[11] "2008-04-13" "2008-05-13"


On 6/13/07, Patnaik, Tirthankar <tirthankar.patnaik_at_citi.com> wrote:
> Hi,
> I have some confusion in applying a function over a column.
>
> Here's my function. I just need to shift non-March month-ends to March
> month-ends. Initially I tried seq.dates, but one cannot give a negative
> increment (decrement) here.
>
> return(as.Date(seq.dates(format(xdate,"%m/%d/%Y"),by="months",len=4)[4])
> )
>
> Hence this simple function:
>
> > mydate <- as.Date("2006-01-01")
> >
> > # Function to shift non-March company-reporting dates to March.
> > Set2March <- function(xdate){
> + # Combines non-March months into March months:
> + # Dec2006 -> Mar2007
> + # Mar2006 -> Mar2006
> + # Jun2006 -> Mar2006
> + # Sep2006 -> Mar2006
> + # VERY Specific code.
> + Month <- format(xdate,"%m")
> + wDate <- month.day.year(julian(xdate))
> + if (Month=="12"){
> + wDate$year <- wDate$year + 1
> + wDate$month <- 3
> + }else
> + if (Month=="06"){
> + wDate$month <- 3
> + }else
> + if (Month=="09"){
> + wDate$month <- 3
> + wDate$day <- wDate$day + 1
> + }else warning ("No Changes made to the month, since month is not
> one of (6,9,12)")
> + cDate <- chron(paste(wDate$month,wDate$day,wDate$year,sep="/"))
> + return(as.Date(as.yearmon(as.Date(cDate,"%m/%d/%y")),frac=1))
> + }
> > Set2March(as.Date("2006-06-30"))
> [1] "2006-03-31"
> > Set2March(mydate)
> [1] "2006-01-31"
> Warning message:
> No Changes made to the month, since month is not one of (6,9,12) in:
> Set2March(mydate)
> >
>
> Works well when I use it on a single date. Then I try it on a vector:
>
>
> > dc <- seq(as.Date("2006-01-01"),len=10, by="month")
> > dc
> [1] "2006-01-01" "2006-02-01" "2006-03-01" "2006-04-01" "2006-05-01"
> "2006-06-01" "2006-07-01" "2006-08-01"
> [9] "2006-09-01" "2006-10-01"
>
>
> > sapply(as.vector(dc),Set2March)
> Error in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3,
> :
> unimplemented type 'character' in 'asLogical'
> >
>
> What am I missing here? Shouldn't the function work with the sapply
> working on each entry?
>
>
> TIA and best,
> -Tir
>
> ______________________________________________
> R-help_at_stat.math.ethz.ch 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.
>



R-help_at_stat.math.ethz.ch 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. Received on Wed 13 Jun 2007 - 13:28:33 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 13 Jun 2007 - 13:31:50 GMT.

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