从因子变量中删除特定因子水平

时间:2014-01-03 21:54:38

标签: r dataframe levels

我有一个数据框,其中有几个变量有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级。我不想从所有变量中删除级别b只是级别e。我已经找到了一种方法来删除一个特定的级别,但还没有找到答案。任何人都可以告诉我如何删除一个特定的因子水平?我理想的是一个droplevels命令,我可以告诉他删除级别e。这样的功能是否存在?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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是通用的,因子和数据框对象都有两种方法。

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