This is a variant that does not use 'tabulate'. As before, there is no restriction for anyone to use this code.
droplevels2i <- function(x) { if (is.null(levels(x))) stop("no 'levels' attribute") nlev <- length(levels(x)) y <- unclass(x) used <- logical(nlev) used[] <- FALSE used[y] <- TRUE tb <- used tb[used] <- seq(length=sum(used)) y[] <- tb[y] levels(y) <- levels(x)[used] attr(y, "class") <- attr(x, "class") y } ------------------------------ Pada Sen, 5 Nov 2012 23:49 ICT Suharto Anggono Suharto Anggono menulis: > >I apologize if this is not appropriate for this mailing list. > >In R, there is already functionality to drop unused factor levels. However, I >am proposing the code below that I wrote. In some occasions, it was faster >than applying function 'factor'. In any case, there is no restriction for >anyone to use the code below. > >droplevels2 <- function(x) { >if (is.null(levels(x))) > stop("no 'levels' attribute") >nlev <- length(levels(x)) >y <- unclass(x) >tb <- tabulate(y, nlev) >used <- as.logical(tb) >tb[used] <- > seq(length=sum(used)) >y[] <- tb[y] >levels(y) <- levels(x)[used] >attr(y, "class") <- > attr(x, "class") >y >} > >Alternatively, one may use 'levels<-.factor' by assigning NA to unused >levels, like below. > >levels(x)[ tabulate( >unclass(x), >length(levels(x))) == 0 ] <- >NA ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel