2014-01-03 4 views
6

У меня есть кадр данных, который имеет несколько переменных, которые имеют 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 падает уровень б от var3 также. Я не хочу удалять уровень b только уровня e из всех переменных. Я искал способ удалить только определенный уровень, но не нашел ответа. Может ли кто-нибудь показать мне, как удалить только определенный факторный уровень? То, что я бы идеально хотел, это команда droplevels, которую я могу сказать, чтобы просто удалить уровень e. Существует ли такая функция?

ответ

7
str(
    as.data.frame(
    lapply(
     df2, 
     function(x) factor(as.character(x), levels=levels(x)[levels(x) != "e"]) 
))) 
# 'data.frame': 10 obs. of 3 variables: 
# $ var1: Factor w/ 4 levels "a","b","c","d": 1 2 3 4 NA 1 2 3 4 NA 
# $ var2: Factor w/ 4 levels "a","b","c","d": NA 4 3 2 1 NA 4 3 2 1 
# $ var3: Factor w/ 4 levels "a","c","d","b": 1 2 3 NA 1 2 3 NA 1 2 
+0

Я не думаю, что 'as.character' необходим. –

+0

Вы правы, но я всегда опасаюсь факторов, которые внезапно ведут себя как их базовые цифры, а не их «ценности». Очевидно, что в функции 'factor' ожидается нормальное поведение. – BrodieG

+0

'' as.data.frame'' messes с именами переменных, но '' check.names = FALSE'' по-видимому. – PatrickT

0

Я не понимаю, почему вы не просто использовать 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 является общим и есть оба метода фактора и dataframe объектов.

> methods(droplevels) 
[1] droplevels.data.frame droplevels.factor  
+1

Я думаю, что он хочет сбросить уровень e из всех столбцов – BrodieG