【问题标题】:Removing Specific factor level from factor variable从因子变量中删除特定因子水平
【发布时间】:2014-01-03 21:54:37
【问题描述】:

我有一个数据框,其中包含多个具有 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。有这样的功能吗?

【问题讨论】:

    标签: r dataframe levels


    【解决方案1】:
    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
    • 你是对的,但我总是对突然表现得像他们的基础数字而不是他们的“价值”的因素非常警惕。显然,在 factor 函数中期望正常行为是合理的。
    • as.data.frame 与变量名混淆,但 check.names = FALSE 显然有帮助。
    【解决方案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    
    

    【讨论】:

    • 我认为他希望从所有列中删除 e 级别
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 2018-12-07
    • 1970-01-01
    相关资源
    最近更新 更多