[R] Confusion with sapply

Gabor Grothendieck ggrothendieck at gmail.com
Wed Jun 13 15:23:03 CEST 2007


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