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

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,而不是b。我已经寻找一种方法来删除特定的水平,但没有找到答案。有人能告诉我如何仅删除特定因子水平吗?理想情况下,我希望有一个droplevels命令,可以让我只删除水平e。是否存在这样的函数?
2个回答

8
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

我认为不需要使用 as.character - IRTFM
你说得没错,但我总是非常警惕因素突然表现出其基础数字而不是它们的“值”。显然,在factor函数中期望正常行为是合理的。 - BrodieG
as.data.frame 会搞乱变量名,但 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 是通用的函数,可用于因子和数据框对象。
> methods(droplevels)
[1] droplevels.data.frame droplevels.factor    

1
我认为他希望从所有列中删除e级别。 - BrodieG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接