On Mon, Feb 16, 2009 at 7:52 PM, Bert Gunter <gunter.ber...@gene.com> wrote: > I suppose the clean way to do this would be to define a cartesian product of > two factors with the induced lexicographic order (is there a standard > function for doing this?):" > > Of course. ?interaction.
Perhaps my specification was unclear, because interaction does not do this: g1 <- factor(c("b","a","c"),levels=c("b","a","c"),ordered=TRUE) g2 <- factor(c(3,10,1,10), levels=c(3,10,1),ordered=TRUE) interaction(g1,g2,lex.order=TRUE) [1] b.3 a.10 c.1 b.10 Levels: b.3 b.10 b.1 a.3 a.10 a.1 c.3 c.10 c.1 Warning message: In ans + ll * if1 : longer object length is not a multiple of shorter object length First problem: it calculates the cartesian product of the *levels*, not of the *values*, so ignores duplicate values, which are important. Second problem: it reorders them alphabetically, ignoring the original orders. Third problem: it gives a warning if the number of levels is not the same. expand.grid is closer, but it produces the cartesian product as a data frame, not a factor, and the first argument varies fastest. Using expand.grid, I suppose you could do: `*.factor` <- function(f1,f2) { val <- do.call(paste,rev(expand.grid(f2,f1))) factor(val, levels=unique(val), ordered=TRUE) } or `*.factor` <- function(f1,f2) factor( do.call(paste,rev(expand.grid(f2,f1))), levels=do.call(paste,rev(expand.grid(unique(f2),unique(f1)))) ordered=TRUE) but to my eye those hardly look nicer than the code I gave before which doesn't use expand.grid. Is there something I'm missing here? -s ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.