Сопоставить значения с ближайшим, большим значением в другом списке в R - PullRequest
2 голосов
/ 10 июля 2020

Есть несколько вопросов о том, как найти номер из списка, ближайший к заданному номеру. Эти ответы, которые в основном включают либо which, либо which.min, являются двусторонними, поэтому они возвращают число из списка, наиболее близкое к заданному числу, независимо от того, больше это число или меньше заданного числа.

Я бы хотел, чтобы возвращаемое число было больше, чем данное число, если само данное число не появится в списке. Эта функция работает, но есть ли способ попроще?

viable_numbers <- c(15, Inf, 5, 10, 5)

picker <- function(x, viable_numbers) {
  if (x %in% viable_numbers) {
    return(x)
    
  } else {
    viable_numbers <- sort(unique(viable_numbers))
    return(viable_numbers[findInterval(x, viable_numbers) + 1])
  }
}
    
picker(x = 1, viable_numbers = viable_numbers)
[1] 5 # works
picker(x = 5, viable_numbers = viable_numbers)
[1] 5 # works
picker(x = 6, viable_numbers = viable_numbers)
[1] 10 # also works
picker(x = 20, viable_numbers = viable_numbers)
[1] Inf # still working

Я предпочитаю решение base, но я также открыт для ответа tidyverse.

1 Ответ

3 голосов
/ 10 июля 2020

Вы можете взять минимум из подмножества жизнеспособных чисел, которые равны или больше x:

picker <-  function(x, viable_numbers) {
  min(viable_numbers[viable_numbers >= x])
}

picker(x = 1, viable_numbers = viable_numbers)
[1] 5
picker(x = 5, viable_numbers = viable_numbers)
[1] 5 
picker(x = 6, viable_numbers = viable_numbers)
[1] 10 
picker(x = 20, viable_numbers = viable_numbers)
[1] Inf 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...