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 ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel