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

时间:2018-05-24 08:43:01

标签: r dplyr

我有一个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)中的错误:         评估错误:没有适用于&#39;组的方法&#39;适用于类&#34;因素&#34;。

的对象

3 个答案:

答案 0 :(得分:4)

在tidyverse中实际上有一个名为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

答案 1 :(得分:3)

使用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

答案 2 :(得分:1)

使用replaceave

的基准R方法
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"

在这里,我们计算每个组的lengthcolour)和replace,其中length小于2的“其他”值。

如果您愿意,可以在应用模型之前使用colouras.factor转换回因子。