[R] Confusion with sapply

Patnaik, Tirthankar tirthankar.patnaik at citi.com
Thu Jun 14 14:14:36 CEST 2007


Thanks Gabor, this is cool!

Best,
-Tir 

> -----Original Message-----
> From: Gabor Grothendieck [mailto:ggrothendieck at gmail.com] 
> Sent: Wednesday, June 13, 2007 6:53 PM
> To: Patnaik, Tirthankar [GWM-CIR]
> Cc: r-help at stat.math.ethz.ch
> Subject: Re: [R] Confusion with sapply
> 
> 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.
> >
>



More information about the R-help mailing list