функция обрезки дает неровный первый разрыв - PullRequest
3 голосов
/ 11 февраля 2020

Я изучаю использование функции cut и пытаюсь разделить следующий базовый вектор c на 10 разрывов. Я могу это сделать, но меня смущает, почему мой первоначальный разрыв происходит при -0,1, а не 0:

test_vec <- 0:10
test_vec2 <- cut(test_vec, breaks = 10)
test_vec2

Выход:

(-0.01,1] (-0.01,1] (1,2]     (2,3]     (3,4]     (4,5]     (5,6]     (6,7]     (7,8]     (8,9]    (9,10]

Почему это произвести 2 экземпляра (-0.01,1] (-0.01,1], а нижнее число не начинается с 0?

1 Ответ

3 голосов
/ 11 февраля 2020

tl; dr , чтобы получить то, что вам может понадобиться, вам, вероятно, потребуется явно указать разрывы, и include.lowest=TRUE:

cut(x,breaks=0:10,include.lowest=TRUE)

Проблема, вероятно, заключается в том, что «Детали» в ?cut:

Когда «разрывы» заданы как одно число, диапазон данных делится на фрагменты «разрывов» одинаковой длины, а затем внешние пределы отклоняются на 0,1% диапазона, чтобы оба экстремальных значения попадали в интервалы перерыва.

Поскольку диапазон равен (0,10), внешние пределы (-0,01, 10.01 ); как предполагает @Onyambu, результаты являются асимметричными c, потому что значение в 0 лежит на левой границе (не включено), тогда как значение в 10 лежит на правой границе (включено).

(Очевидная) асимметрия происходит из-за форматирования; если вы будете следовать приведенному ниже коду (ядро base:::cut.default(), вы увидите, что верхний разрыв на самом деле равен 10.01, но форматируется как «10», потому что число цифр по умолчанию - 3 ...

x <- 0:10
breaks <- 10
dig <- 3
nb <- as.integer(breaks+1)
dx <- diff(rx <- range(x, na.rm = TRUE))
breaks <- seq.int(rx[1L], rx[2L], length.out = nb)
breaks[c(1L, nb)] <- c(rx[1L] - dx/1000, rx[2L] +  dx/1000)
ch.br <- formatC(0 + breaks, digits = dig, width = 1L)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...