Уменьшение количества уровней факторов перед моделированием - PullRequest
0 голосов
/ 24 мая 2018

У меня есть коэффициент с 2600 уровнями, и я хочу уменьшить его до ~ 10 перед моделированием

Я подумал, что мог бы сделать это с помощью операции, которая говорит: «если фактор указан в списке меньше, чем х раз, ондолжен быть помещен в корзину с именем «other»

Вот некоторые примеры данных:

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 ]

0 голосов
/ 24 мая 2018

На самом деле в 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
0 голосов
/ 24 мая 2018

Подход базового R с использованием 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) и replace значения с "Other", гдеlength меньше 2.

Если вы хотите, вы можете преобразовать colour обратно в коэффициенты, используя as.factor перед применением вашей модели.

0 голосов
/ 24 мая 2018

с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...