Дискретизация переменной и предоставление ограничений

#r #dplyr #tidyverse

#r #dplyr #tidyverse

Вопрос:

Базовая cut функция и dplyr cut_* функции дискретизируют непрерывные переменные. Но ни один из них не дает возможности указывать верхние / нижние границы для включения в дискретизированные интервалы.

Например, используя cut_number в приведенном ниже примере

 library(tidyverse)
set.seed(901)
df = tibble(x =runif(min = 0.1, max = 0.9, n = 5)) %>% 
    arrange(x)

df = df %>% 
    mutate(x_binned = cut_number(x, n=3))

df
#> # A tibble: 5 x 2
#>       x x_binned     
#>   <dbl> <fct>        
#> 1 0.187 [0.187,0.529]
#> 2 0.524 [0.187,0.529]
#> 3 0.540 (0.529,0.671]
#> 4 0.737 (0.671,0.768]
#> 5 0.768 (0.671,0.768]
 

Создано 2020-12-24 пакетом reprex (версия 0.3.0)

Нижний интервал [0.187, 0.529] равен, а верхний интервал равен [0.671, 0.768] . Но мне нужно, чтобы интервалы включали 0 и 1 или были [0, 0.529] и [0.671, 1.0] . Есть ли простой способ указать эти границы при дискретизации непрерывных переменных?

Комментарии:

1. Учитывая, что нижний предел вашего runif распределения равен 0.1, что означает включение нижней границы (0) ниже возможного диапазона выборочных значений?

2. Вы могли бы использовать case_when или его базовый эквивалент, switch , для построения функции, которая поддерживает определение двухсторонних замкнутых интервалов на векторах. (Я стараюсь избегать вложенных или каскадных ifelse решений, когда это возможно.)

Ответ №1:

Вы можете создать последовательность, указав ее длину, и использовать ее в cut качестве breaks .

 n <- 3
seq(0, 1, length.out = n)
#[1] 0.0 0.5 1.0

transform(df, x_binned = cut(x, seq(0, 1, length.out = n)))

#      x x_binned
#1 0.187  (0,0.5]
#2 0.524  (0.5,1]
#3 0.540  (0.5,1]
#4 0.737  (0.5,1]
#5 0.768  (0.5,1]