Проверьте, находится ли число между двумя другими - PullRequest
0 голосов
/ 06 декабря 2018

Я ищу функцию, которая проверяет, находится ли число между двумя другими числами.Мне также нужно контролировать, если я хочу строгое сравнение (

Я знаю функцию between() в dplyr. Тем не менее, я должен знать верхнее и нижнее числа.

MyNumber = 8
First = 2
Second = 10
# This will return TRUE
between(MyNumber, lower =  First, upper =  Second)
# But this will return FALSE
between(MyNumber, lower =  Second, upper =  First)
# This will return TRUE. I want it to return FALSE
First = 8
between(MyNumber, lower =  First, upper =  Second)

Iнужна функция, которая возвращает TRUE независимо от порядка.

Ответы [ 4 ]

0 голосов
/ 06 декабря 2018

Что не так с

f_between <- function (num, L, R) num>=min(L,R) & num<=max(L,R)

f_between(8, 2, 10)
#[1] TRUE
f_between(6, 6, 10)
#[1] TRUE
f_between(2, -10, -2)
#[1] FALSE
f_between(3, 5, 7)
#[1] FALSE
0 голосов
/ 06 декабря 2018

Вы можете сделать это с помощью простой арифметики:

between <- function(number, first, second) { (first - number) * (second - number) < 0 }

Вот несколько примеров выходных данных:

> between(8, 2, 10)
[1] TRUE
> between(8, 10, 2)
[1] TRUE
> between(8, 10, 12)
[1] FALSE
> between(8, 1, 2)
[1] FALSE
0 голосов
/ 06 декабря 2018

Вы можете использовать %in% с функцией :, если вы теперь first и last:

first <- 2
last <- 10
number <- 8

number %in% first:last 
[1] TRUE

first <- 10
last <- 2
number <- 8
number %in% first:last
[1] TRUE


first <- 10
last <- 12
number <- 8
number %in% first:last
[1] FALSE

first <- 12
last <- 10
number <- 8
number %in% first:last
[1] FALSE

В функции, а strict позволяет вам учитывать или не строгосравнение:

my_between <- function(n, f, l, strict = FALSE) {
  if (!strict) { 
    n %in% f:l # if strict == FALSE (default)
  } else {
    n %in% (f+1):(l-1) # if strict == TRUE 
  }
}

my_between(8, 2, 10)
0 голосов
/ 06 декабря 2018

Что-то вроде:

between2 <- function(number,bounds) { number > min(bounds) & number < max(bounds)} 
between2(8, c(2,10))
[1] TRUE
between2(8, c(10,2))
[1] TRUE

Эта функция также работает с вашим добавленным условием

between2(8,c(8,10))
[1] FALSE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...