【问题标题】:How to remove one specific factor level in all factor variables in r?如何在 r 中的所有因子变量中删除一个特定的因子水平?
【发布时间】:2016-11-17 11:45:42
【问题描述】:

例如,我有 6 列的数据框(都是因子)。

我想从出现此级别的所有因素中删除特定级别,例如“否”。

我想从我的因子变量中删除因子级别“否”,同时我想删除(设置为 NA)所有具有“否”值的答案。

我试过这段代码:

sapply(fact,function(x) levels(x)[levels(x) == "no"] <- NULL)

但是这段代码不起作用。

我该怎么做?

【问题讨论】:

  • 这不是一个直接的答案,但请考虑droplevels 是否适合您的情况。如果是,您的代码将简化为 lapply(fact, droplevels)
  • @KonradRudolph,在这种情况下,他们可以使用droplevels(fact)
  • 正如 Konrad 所说,您的问题并不清楚。您是要删除答案为“否”的观测值,还是已删除它们而您只是想从因子水平中删除该水平?
  • @lmo 我想从我的因子变量中删除因子级别“否”,同时我想删除(设置为 NA)所有具有“否”值的答案。跨度>
  • 要将所有列的因子转换为 NA,请使用 lapply(df, function(x) { levels(x)[levels(x) %in% 'c']=NA ; return(x) })

标签: r dataframe lapply na


【解决方案1】:

我认为这应该可以完成您正在尝试做的事情。

dfNew <- data.frame(lapply(df, function(x) {is.na(x[x=="no"]) <- TRUE; droplevels(x)}))

数据

set.seed(1234)
df <- data.frame(q1=sample(c("yes", "no", "maybe"), 20, replace=TRUE),
                 q2=sample(c("yes", "no", "maybe"), 20, replace=TRUE),
                 q3=sample(c("yes", "no", "maybe"), 20, replace=TRUE))

【讨论】:

    【解决方案2】:

    这个怎么样:

    > df
       # c1  c2  c3
    # 1 yes yes  no
    # 2  no  ok yes
    # 3  ok  no  ok
    # 4 yes yes  no
    # 5  no  ok yes
    # 6  ok  no  ok
    # 7 yes yes  no
    # 8  no  ok yes
    # 9  ok  no  ok
    
    toRemove <- "no"
    data.frame(lapply(df, 
              function(x) factor(as.character(x), levels=levels(x)[levels(x)!=toRemove])))
    
        # c1   c2   c3
    # 1  yes  yes <NA>
    # 2 <NA>   ok  yes
    # 3   ok <NA>   ok
    # 4  yes  yes <NA>
    # 5 <NA>   ok  yes
    # 6   ok <NA>   ok
    # 7  yes  yes <NA>
    # 8 <NA>   ok  yes
    # 9   ok <NA>   ok
    

    玩具数据

    df <- structure(list(c1 = structure(c(3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 
    2L), .Label = c("no", "ok", "yes"), class = "factor"), c2 = structure(c(3L, 
    2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L), .Label = c("no", "ok", "yes"
    ), class = "factor"), c3 = structure(c(1L, 3L, 2L, 1L, 3L, 2L, 
    1L, 3L, 2L), .Label = c("no", "ok", "yes"), class = "factor")), .Names = c("c1", 
    "c2", "c3"), row.names = c(NA, -9L), class = "data.frame")
    

    【讨论】:

      【解决方案3】:

      上面的答案很好。我要补充一点,如果不是所有列都是因子和/或您想要保留所有因子级别(包括没有数据的因子级别),而不是明确删除的,您将需要一种更通用的方法:

      #Define a helper function
      removeOneLevel <- function(v, badlevel){
        v[v==badlevel] = NA
        v2 = droplevels(v)
        levels(v2) = levels(v)[levels(v) != badlevel]
        return(v2)}
      
      # Use dplyr to perform that function on all factor columns
      library(dplyr)
      dfNew = mutate_if(df, is.factor, removeOneLevel, badlevel = 'no')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多