Создайте интервал - Base R - PullRequest
1 голос
/ 05 мая 2020

Я хотел бы создать единичный интервал без использования функции cut. Например, для заданных целых чисел a и b интервал (a,b] может быть создан путем вызова cut(c(a, 2 * b - a), 2)[1]:

a <- 2.10
b <- 2.15
intervals = cut(c(a, 2 * b - a), 2)
intervals[1]
#> [1] (2.1,2.15]
#> Levels: (2.1,2.15] (2.15,2.2]

Как я могу создать (a,b] без этого обходного пути? Мне не удалось найти никакой документации по интервалам вне документации для функций cut и findInterval.

Ответы [ 2 ]

1 голос
/ 06 мая 2020

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

Поскольку «интервалы», возвращаемые cut, являются не чем иным, как векторами символов, вы можете построить их, используя свои переменные a и b, и использовать их для проверки того, есть ли конкретный интервал из -интерес присутствует в выводе cut.

Пример: сначала сделайте несколько интервалов для поиска в пределах:

set.seed(1)
mydata=sample(1:100,20)
mycutintervals=cut(mydata,7)
mycutintervals

Теперь создайте интересующие интервалы, чтобы проверить, присутствуют ли они :

make_interval=function(x,y) paste0("(",x,",",y,"]")

a=19
b=32
# is interval from a to b present?
make_interval(a,b) %in% mycutintervals
# [1] TRUE

c=50
# what about interval from a to c?
make_interval(a,c) %in% mycutintervals
# [1] FALSE
0 голосов
/ 06 мая 2020

Возможно, вам может помочь один из вариантов ниже

> cut(c(a,b),range(c(a-.Machine$double.eps,b)))
[1] (2.1,2.15] (2.1,2.15]
Levels: (2.1,2.15]

или

> na.exclude(cut(c(a,b),range(a,b)))
[1] (2.1,2.15]
attr(,"na.action")
[1] 1
attr(,"class")
[1] exclude
Levels: (2.1,2.15]
...