Given the following mock data:
set.seed(123)
x <- data.frame(let = sample(letters[1:5], 100, replace = T),
num = sample(1:10, 100, replac
Just do y$let <- factor(y$let)
. Running factor
on an existing factor variable will reset the levels to only those that are present.
There's a recently added function in R for this:
y <- droplevels(y)
Adding to Hong Ooi's answer, here is an example I found from R-Bloggers.
# Create some fake data
x <- as.factor(sample(head(colors()),100,replace=TRUE))
levels(x)
x <- x[x!="aliceblue"]
levels(x) # still the same levels
table(x) # even though one level has 0 entries!
The solution is simple: run factor() again:
x <- factor(x)
levels(x)