Удаление определенного уровня фактора из факторной переменной

У меня есть фрейм данных с несколькими переменными, которые имеют 5 уровней фактора. Я хочу удалить только один из этих уровней. Сначала я назначил все экземпляры этого уровня NA, а затем использовал команду droplevels, чтобы избавиться от пустых уровней.

Однако для одной переменной в моем фрейме данных один из уровней, которые я не хочу отбрасывать, не имеет в нем наблюдений. Есть ли способ удалить только определенный факторный уровень, а не только пустые.

Вот воспроизводимый пример

df <- data.frame(var1=rep(letters[1:5],2),var2=rep(letters[5:1],2),var3=c("a","c","d","e","a","c","d","e","a","c"))
levels(df$var3)<-c("a","c","d","e","b")

Это устанавливает фрейм данных, подобный моему. Теперь я хочу удалить все экземпляры уровня e, а затем отбросить его как возможный уровень. Я делаю это с помощью кода ниже.

df2<-replace(df, df=="e",NA)
df2<-droplevels(df2)

Проблема в том, что когда я использую droplevels, он также снижает уровень b из var3. Я не хочу удалять уровень b только уровень e из всех переменных. Я искал способ удалить только определенный уровень, но не нашел ответа. Может ли кто-нибудь показать мне, как удалить только определенный уровень фактора? В идеале мне бы хотелось, чтобы команда droplevels просто удалила уровень e. Существует ли такая функция?


person user2460499    schedule 03.01.2014    source источник


Ответы (2)


Я не понимаю, почему вы просто не используете droplevels в интересующем столбце факторов:

df2$var2 <- droplevels(df2$var2)

> lapply(df2, levels)
$var1
[1] "a" "b" "c" "d" "e"

$var2
[1] "a" "b" "c" "d"

$var3
[1] "a" "c" "d" "e" "b"

Объяснение: droplevels является общим, и существуют оба метода для объектов фактора и фрейма данных.

> methods(droplevels)
[1] droplevels.data.frame droplevels.factor    
person IRTFM    schedule 03.01.2014
comment
Я думаю, он хочет убрать уровень e из всех столбцов. - person BrodieG; 04.01.2014

person    schedule
comment
Я не думаю, что as.character нужен. - person IRTFM; 04.01.2014
comment
Вы правы, но я всегда очень настороженно отношусь к факторам, которые внезапно начинают вести себя как их базовые числа, а не их значения. Очевидно, что в пределах функции factor разумно ожидать нормального поведения. - person BrodieG; 04.01.2014
comment
as.data.frame путается с именами переменных, но check.names = FALSE, по-видимому, помогает. - person PatrickT; 23.01.2018