Каковы ограничения для параметра закрытия влево / вправо для функции cut в R?

#r

#r

Вопрос:

Итак, я изучал линейную регрессию и наткнулся на функцию cut. Я знаю, что по умолчанию разрывы закрыты справа (т. Е. (x-y]), а установка right=FALSE делает его закрытым слева (т. е. [x-y)). Есть ли способ сделать разрезы как с закрытыми (т.е. [x-y]), так и с открытыми (т.е. (x-y))? Я понимаю, что это, вероятно, непрактично, но мне просто любопытно получить ответ на этот вопрос.

Спасибо!

Ответ №1:

Короткий ответ — нет.

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

cut делит диапазон x на интервалы и кодирует значения в x соответствии с тем, в какой интервал они попадают. Крайний левый интервал соответствует первому уровню, следующий крайний левый — второму уровню и так далее.

Из: https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/cut

И что касается этой цели, каждый элемент x должен принадлежать одной и только одной группе в определении cut. Особый случай, когда вы получили это [x-y] прямо из коробки, относится к первой группе, где у вас есть right=TRUE amp; include.lowest=TRUE . Кроме этого, это зависит от того, как вы интерпретируете группу или помечаете их.

 x <- seq(1, 100, by = 1)
cut(x, breaks = c(1, 25, 50, 75, 100), include.lowest = TRUE, right = TRUE,
  labels = c("[1, 25]", "[26, 50]", "[51, 75]", "[76, 100]"))
 

Создайте cut с этими уровнями — так, может быть, это то, что вы хотите? Вместо этого метки?

 Levels: [1, 25] [26, 50] [51, 75] [76, 100]
 

Хотя это было бы правильным названием для случая со всеми целыми числами, но когда вы получаете действительное число с десятичными точками, тогда такие ручные метки, как это, уже не очень точны.

Ответ №2:

Если вам действительно нужны произвольные ограничения, вы можете использовать (мой) santoku пакет:

 library(santoku)

# left_vec is TRUE where a break is left-closed like ...)[...
# so this creates breaks like [-Inf, 1) [1, 2] (2, 3) [3, 4) [4, Inf ]
breaks <- brk_manual(1:4, left_vec = c(TRUE, FALSE, TRUE, TRUE))

x <- seq(0, 5, 0.5)
chopped <- chop(x, breaks, extend = TRUE)
data.frame(x, chopped)
 

что дает

  x   chopped
1  0.0 [-Inf, 1)
2  0.5 [-Inf, 1)
3  1.0    [1, 2]
4  1.5    [1, 2]
5  2.0    [1, 2]
6  2.5    (2, 3)
7  3.0    [3, 4)
8  3.5    [3, 4)
9  4.0 [4, Inf ]
10 4.5 [4, Inf ]
11 5.0 [4, Inf ]