R: создать новую категориальную переменную из категориальной переменной на основе непрерывной переменной - PullRequest
0 голосов
/ 04 февраля 2019

Я уже посмотрел здесь , где используется функция cut.Тем не менее, я не смог найти умного решения, учитывая мою ситуацию.

Сначала приведем несколько примеров данных, которые у меня сейчас есть:

df <- data.frame(Category = LETTERS[1:20]
                 , Nber_within_category = c(rep(1,8), rep(2,3), rep(6,2), rep(10,3), 30, 50, 77, 90)
                 )

Я хотел бы создать третий столбец, который формирует новую категорию на основе столбца Nber_within_category.В этом примере, как я могу сделать, например, Category_new таким, чтобы в каждой категории Nber_within_category было по крайней мере 5 с ограничением на то, что если Category уже имеет Nber_within_category >= 5, то берется исходная категория.

Так, например, это должно выглядеть так:

df <- data.frame(Category = LETTERS[1:20]
                 , Nber_within_category = c(rep(1,8), rep(2,3), rep(6,2), rep(10,3), 30, 50, 77, 90)
                 , Category_new = c(rep('a',5), rep('b', 4), rep('c',2), LETTERS[12:20])
)

1 Ответ

0 голосов
/ 04 февраля 2019

Это что-то вроде хака, но это работает:

df %>% 
  mutate(tmp = floor((cumsum(Nber_within_category) - 1)/5)) %>% 
  mutate(new_category = ifelse(Nber_within_category >= 5,
                               Category,
                               letters[tmp+1]))

Строка floor((cumsum(Nber_within_category) - 1)/5) - это способ классификации cumsum с ячейками размера 5 (-1, чтобы включить строки, где суммаровно 5), и который я использую в качестве индекса для получения новых категорий для строк, где Nber_within_category < 5

Может быть проще понять, как определяется столбец tmp, если вы запустите:

x <- 1:100
data.frame(x, y = floor((x- 1)/5))
...