Непоследовательное поведение `cut`: разные интервалы с одинаковым номером и одинаковыми отображаемыми точками разреза

Я столкнулся со следующим противоречивым поведением cut который вызывает у меня головную боль:

x <- 0.2316
cut(x, c(0, 0.2315, 10)) #gives 0.232 as cutpoint and choses second interval
## [1] (0.232,10]
## Levels: (0,0.232] (0.232,10]
cut(x, c(0, 0.232, 10)) #choses first interval when taking the same cutpoint it just gave (0.232)
## [1] (0,0.232]
## Levels: (0,0.232] (0.232,10]

Проблема в том, что cut кажется, выбрал интервал до форматирования (округления) точек вырезания. Это приводит к противоречивому поведению в примере, когда он выбирает второй интервал, но выбрал бы первый интервал в соответствии с заданной точкой разреза (что можно увидеть в последней строке).

Это проблема для меня, потому что у меня есть две функции в моем пакете: одна вычисляет точки среза, а вторая определяет правильные интервалы, в которые нужно помещать новые точки данных. В приведенном выше примере та же самая точка данных помещается во второй интервал в первой функции, но в первый интервал во второй функции - отображая точно такие же точки разреза! Это может привести к некоторому странному поведению в моей упаковке!

Мой вопрос
Это известная проблема? И если да, есть ли обходные пути? Спасибо

редактировать
Я знаю, что вы можете изменить количество знаков после запятой с dig.lab все же та же самая проблема возникла бы, если бы у вас были точки разреза с большим количеством десятичных знаков. Приведенный выше пример является просто демонстрацией более общей проблемы!

1 ответ

Решение

Я только что посмотрел на исходный код cut.default и я думаю, что одним из обходных путей было бы применить то же форматирование, которое применяется к распечатке на breaks перед вызовом cut функция:

breaks <- as.numeric(formatC(0 + c(0, 0.2315, 10), digits = 3, width = 1L))
cut(x, breaks = breaks)
## [1] (0,0.232]
## Levels: (0,0.232] (0.232,10]

Тогда, по крайней мере, все согласованно (поэтому в этом случае первый интервал выбирается в обоих случаях).

Но это работает только в тех случаях, когда вы устанавливаете точки среза явно!

Другие вопросы по тегам