Tidyverse: преобразование числовых данных в категориальные данные для построения графиков с неравномерной шириной бункера

Используя tidyverse, я хочу дискретизировать числовые данные с целью использования гистограммы для построения различных числовых диапазонов, как если бы данные были категориальными, путем объявления вручную, где происходят сокращения, например, с возрастными группами или диапазонами доходов. Я хочу, чтобы интервалы были неравной ширины.

До сих пор я пробовал базовый подход R, используя cut() и задавая ячейки с помощью breaks = c(). Однако я заметил, что в пакете ggplot2 существует набор функций cut_interval, cut_width и cut_number. Я полагаю, что есть способ вручную установить интервалы сокращения с помощью этих функций, потому что аргумент breaks существует для варианта интервала и числа.

library(tidyverse)

mtcars <- as_tibble(mtcars)

mtcars %>% 
  count(cut_interval(mpg, n = 4))
#> # A tibble: 4 x 2
#>   `cut_interval(mpg, n = 4)`     n
#>   <fct>                      <int>
#> 1 [10.4,16.3]                   10
#> 2 (16.3,22.1]                   13
#> 3 (22.1,28]                      5
#> 4 (28,33.9]                      4

mtcars %>% 
  count(cut_interval(mpg, n = 4, breaks = c(10, 18, 23, 28, 35)))
#> Error: Evaluation error: lengths of 'breaks' and 'labels' differ.

Создано 03.06.2019 с помощью пакета REPEX (v0.2.1)

Вышесказанное близко к тому, что я хочу, но оно устанавливает перерывы в зависимости от количества интервалов.

В приведенном выше примере я хотел бы, чтобы мои группы были именно такими:

10-18, 19-23, 24-28, 29-35.

Возможно ли это с использованием аргумента breaks? Спасибо.


person Chris Aguilar    schedule 03.06.2019    source источник


Ответы (1)


Для этого вы можете просто использовать фактическую функцию base cut:

library(tidyverse)

mtcars %>% 
    mutate(bin = cut(mpg, breaks = c(Inf, 10, 18, 19, 23, 24, 28, 29,35))) %>% 
    count(bin)

Что даст вам:

# A tibble: 5 x 2
  bin         n
  <fct>   <int>
1 (10,18]    13
2 (18,19]     2
3 (19,23]    10
4 (24,28]     3
5 (29,35]     4
person MDEWITT    schedule 03.06.2019
comment
И все функции, перечисленные в вопросе, являются оболочками для base::cut. - person Brian; 03.06.2019