From marc_schwartz at comcast.net  Tue Nov 14 18:57:10 2006
From: marc_schwartz at comcast.net (Marc Schwartz)
Date: Tue, 14 Nov 2006 11:57:10 -0600
Subject: [Rd] c.factor
In-Reply-To: <1163526685.4492.20.camel@localhost.localdomain>
References: <946928E281E8FD4B91D5B2CC3C91967D6AA9A0@lnex01.CONCORDIAFUNDS.COM>
	<1163526685.4492.20.camel@localhost.localdomain>
Message-ID: <1163527030.4492.23.camel@localhost.localdomain>

On Tue, 2006-11-14 at 11:51 -0600, Marc Schwartz wrote:
> On Tue, 2006-11-14 at 16:36 +0000, Matthew Dowle wrote:
> > Hi,
> > 
> > Given factors x and y,  c(x,y) does not seem to return a useful result :
> > > x
> > [1] a b c d e
> > Levels: a b c d e
> > > y
> > [1] d e f g h
> > Levels: d e f g h
> > > c(x,y)
> >  [1] 1 2 3 4 5 1 2 3 4 5
> > > 
> > 
> > Is there a case for a new method c.factor as follows?  Does something
> > similar exist already?  Is there a better way to write the function?
> > 
> > > c.factor = function(x,y)
> > {
> >     newlevels = union(levels(x),levels(y))
> >     m = match(levels(y), newlevels)
> >     ans = c(unclass(x),m[unclass(y)])
> >     levels(ans) = newlevels
> >     class(ans) = "factor"
> >     ans
> > }
> > > c(x,y)
> >  [1] a b c d e d e f g h
> > Levels: a b c d e f g h
> > > as.integer(c(x,y))
> >  [1] 1 2 3 4 5 4 5 6 7 8
> > >
> > 
> > Regards,
> > Matthew
> 
> I'll defer to others as to whether or not there is a basis for c.factor,
> however:
> 
> c.factor <- function(...)
> {
>   args <- list(...)
> 
>   # this could be optional
>   if (!all(sapply(args, is.factor)))
>    stop("All arguments must be factors")
> 
>   factor(unlist(lapply(args, function(x) as.character(x))))
> }


That last line can even be cleaned up, as I was doing something else
initially:

c.factor <- function(...)
{
  args <- list(...)

  if (!all(sapply(args, is.factor)))
   stop("All arguments must be factors")

  factor(unlist(lapply(args, as.character)))
}


Marc



[Rd] c.factor
Marc Schwartz