Подтвердить что ты не робот

Как я могу удалить неиспользуемые уровни из фрейма данных?

Учитывая следующие макетные данные:

set.seed(123)
x <- data.frame(let = sample(letters[1:5], 100, replace = T), 
                num = sample(1:10, 100, replace = T))
y <- subset(x, let != 'a')

Создание таблицы y$let дает

a  b  c  d  e 
0 20 21 22 18

Но я не хочу, чтобы a показывал больше. Если я попытаюсь сделать это:

levels(y$let) <- factor(y$let)

Я помещаю частоты, так как теперь table(y$let) дает мне

b  d  c  e 
0 20 21 40 

Я знаю, что могу сделать xtabs(~ y$let, drop.unused.levels = T) и обойти проблему, но не reset уровни переменных в своей основе (что важно для меня, так как это раннее изменение, которое я делаю к набору данных, который будет продолжаться на протяжении всего анализа). Более того, xtabs - это другой класс из table, который даст мне головные боли позже в проекте.

Вопрос: как я могу автоматически изменить levels(y$let), чтобы он не отображал уровни, которые были удалены при создании подмножества? В этом случае, как я могу заставить его показать [1] "b" "c" "d" "e"?

4b9b3361

Ответ 1

Недавно добавлена ​​функция в R:

y <- droplevels(y)

Ответ 2

Просто сделайте y$let <- factor(y$let). Запуск factor по существующей фактор-переменной будет reset для уровней только тех, которые присутствуют.

Ответ 3

Добавление в ответ Hong Ooi, вот пример, который я нашел у 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)