[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