Hi r-help-boun...@r-project.org napsal dne 03.02.2010 14:52:02:
> Dear list, > > I cannot find an elegant solution to this problem. I have a factor f > containing several levels (5) and I wish to create a new factor of the > same length with fewer levels (2). This new factor should therefore > group together some levels of the original data. Ideally this grouping > would be at random, i.e I would not group together the first 2 levels > of f, then the following 3, etc. > > Below is a minimal example (my real problem has more levels, otherwise > I would do the operation manually...) > > f <- factor(rep(sample(letters[1:5], 20, repl=TRUE), each=10)) > > # permute the levels in random order > disorder <- sample(levels(f), length(levels(f))) > > # new levels matching the old ones > new.lev <- rep(LETTERS[1:2], length=length(disorder)) > > # associate old levels to new ones > groups <- split(disorder, new.lev) > > # test each element of f for its new category > test <- lapply(groups, function(g) f %in% g) > > # f2 is the new factor, initialized with f > f2 <- as.character(f) > > # recursively modify f2 > sapply(seq_along(test), function(ii) f2[test[[ii]]] <<- names(test[ii])) > > # make it a factor > f2 <- factor(f2) > > Any suggestions are very welcome, I must have missed something more obvious! # order levels f.t<-factor(f, levels=disorder) # change levels levels(f.t) <- new.lev all.equal(f.t,f2) [1] TRUE Regards Petr > > Best regards, > > baptiste > > ______________________________________________ > 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. ______________________________________________ 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.