A search for "c.factor" returns tons of hits on this topic.

Heres just one of the hits from 2006, when I asked the same question : 
http://tolstoy.newcastle.edu.au/R/e2/devel/06/11/1137.html

So it appears to be complicated and there are good reasons.
Since I needed it, I created c.factor in data.table package, below. It does 
it more efficiently since it doesn't convert each factor to character (hence 
losing some of the benefit). I've been told I'm not unique in this approach 
and that other packages also have their own c.factor.  It deliberately isn't 
exported.  Its worked well for me over the years anyway.

c.factor = function(...)
{
    args <- list(...)
    for (i in seq(along=args)) if (!is.factor(args[[i]])) args[[i]] = 
as.factor(args[[i]])
    # The first must be factor otherwise we wouldn't be inside c.factor, its 
checked anyway in the line above.
    newlevels = sort(unique(unlist(lapply(args,levels))))
    ans = unlist(lapply(args, function(x) {
        m = match(levels(x), newlevels)
        m[as.integer(x)]
    }))
    levels(ans) = newlevels
    class(ans) = "factor"
    ans
}

"Hadley Wickham" <had...@rice.edu> wrote in message 
news:f8e6ff051002040753x33282f33l78fce9f98dc29...@mail.gmail.com...
> Hi all,
>
> Is there are reason that there is no c.factor method?  Analogous to
> c.Date, I'd expect something like the following to be useful:
>
> c.factor <- function(...) {
>  factors <- list(...)
>  levels <- unique(unlist(lapply(factors, levels)))
>  char <- unlist(lapply(factors, as.character))
>
>  factor(char, levels = levels)
> }
>
> c(factor("a"), factor("b"), factor(c("c", "b","a")), factor("d"))
> # [1] a b c b a d
> # Levels: a b c d
>
> Hadley
>
> -- 
> http://had.co.nz/
>

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to