[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
More information about the R-devel
mailing list