我有一个数据框,其中有几个变量有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。这样的功能是否存在?
答案 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