# [Rd] c.factor

Marc Schwartz marc_schwartz at comcast.net
Tue Nov 14 18:57:10 CET 2006

```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

```