【问题标题】:Collapsing factor level for all the factor variable in dataframe based on the count基于计数的数据框中所有因子变量的折叠因子级别
【发布时间】:2016-12-11 20:04:46
【问题描述】:

我想只保留基于频率的前 2 个因素水平,并将所有其他因素分组到“其他”中。我试过了,但没有帮助。

df=data.frame(a=as.factor(c(rep('D',3),rep('B',5),rep('C',2))), 
              b=as.factor(c(rep('A',5),rep('B',5))), 
              c=as.factor(c(rep('A',3),rep('B',5),rep('C',2)))) 

myfun=function(x){
    if(is.factor(x)){
        levels(x)[!levels(x) %in% names(sort(table(x),decreasing = T)[1:2])]='Others'  
    }
}

df=as.data.frame(lapply(df, myfun))

预期输出

       a b      c
       D A      A
       D A      A
       D A      A
       B A      B
       B A      B
       B B      B
       B B      B
       B B      B
  others B others
  others B others

【问题讨论】:

  • 您想计算整个数据框或列的因子的频率吗?请分享您的预期输出。
  • 这仅适用于单个变量,我仅根据频率保留前 2 个因素,并将所有其他级别分组为其他。
  • 给定上面的数据框,你能添加预期的输出吗?
  • @sotos 这会起作用,感谢hint.fun1
  • @是的,我明白了,但是我们必须首先按降序重新排列级别,然后执行您所做的操作。你可以把它当作一个答案。

标签: r lapply


【解决方案1】:

这可能会有点混乱,但这是通过 base R 实现的一种方法,

fun1 <- function(x){levels(x) <- 
                    c(names(sort(table(x), decreasing = TRUE)[1:2]), 
                    rep('others', length(levels(x))-2)); 
                    return(x)}

但是,上述函数需要首先重新排序,并且正如 OP 在评论中所述,正确的将是,

fun1 <- function(x){ x=factor(x, 
                     levels = names(sort(table(x), decreasing = TRUE))); 
                     levels(x) <- c(names(sort(table(x), decreasing = TRUE)[1:2]), 
                     rep('others', length(levels(x))-2)); 
                     return(x) } 

【讨论】:

    【解决方案2】:

    感谢forcats 包中的fct_lump(),现在这很容易。

    fct_lump(df$a, n = 2)
    
    # [1] D     D     D     B     B     B     B     B     Other Other
    # Levels: B D Other
    

    参数n 控制要保留的最常见级别的数量,并将其他级别集中在一起。

    【讨论】:

      猜你喜欢
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      • 2014-02-11
      • 1970-01-01
      • 2015-09-04
      相关资源
      最近更新 更多