代码之家  ›  专栏  ›  技术社区  ›  Shinobi_Atobe

在建模前减少因子水平的数量

  •  4
  • Shinobi_Atobe  · 技术社区  · 8 年前

    我有一个2600级的系数,我想在建模前把它降到10级。

    我想我可以通过这样一个操作来完成这个任务:“如果一个因素被列出少于x次,它应该被放入一个名为“其他”的桶中。”

    以下是一些示例数据:

    df <- data.frame(colour=c("blue","blue","blue","green","green","orange","grey"))
    

    这就是我希望得到的结果:

      colour
    1   blue
    2   blue
    3   blue
    4  green
    5  green
    6  other
    7  other
    

    我尝试过以下方法:

    df %>% mutate(colour = ifelse(count(colour) < 2, 'other', colour))
    

    mutate impl(.data,dots)中的错误: 评估错误:“groups”不适用于类“factor”的对象。

    3 回复  |  直到 8 年前
        1
  •  4
  •   Thomas K    8 年前

    事实上,有一个很好的包裹 forcats 这有助于处理各种因素。你可以用 fct_lump ,这正是您所需要的:

    library(tidyverse)
    
    df %>% mutate(colour = fct_lump(colour, n = 2))
    #>   colour
    #> 1   blue
    #> 2   blue
    #> 3   blue
    #> 4  green
    #> 5  green
    #> 6  Other
    #> 7  Other
    
        2
  •  3
  •   Aramis7d    8 年前

    具有 tidyverse 函数,您可以尝试如下操作:

    df %>%
      group_by(colour) %>%
      mutate(cnt = n()) %>%
      mutate(grp = if_else(cnt >= 2, as.character(colour), as.character("Other"))) %>%
      select(-cnt)
    

    它给出(这里,阈值为 >= 2 )

      colour grp  
      <fct>  <chr>
    1 blue   blue 
    2 blue   blue 
    3 blue   blue 
    4 green  green
    5 green  green
    6 orange Other
    7 grey   Other
    
        3
  •  1
  •   Ronak Shah    8 年前

    使用 replace ave

    df$colour <- as.character(df$colour)
    replace(df$colour, ave(df$colour, df$colour, FUN = length) < 2, "Other")
    
    #[1] "blue"  "blue"  "blue"  "green" "green" "Other" "Other"
    

    这里我们计算 length 每组的( colour ) 代替 “其他”的值,其中 长度 小于2。

    如果你想,你可以转换 颜色 返回系数使用 as.factor 在应用模型之前。