#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]