Хобрук: Ваш путь к мастерству в программировании

Найдите ближайшее меньшее число

У меня есть вектор чисел

f <- c(1, 3, 5, 8, 10, 12, 19, 27)

Я хочу сравнить значения в векторе с другим числом и найти ближайшее меньшее значение.

Например, если введено число 18, то ближайшее меньшее значение в векторе будет 12 (позиция 6 в векторе). Если на входе 19, то результатом должно быть значение 19, то есть индекс 7.

18.05.2015

Ответы:


1

Я думаю, что ответ довольно прост:

f <- c(1,3,6,8,10,12,19,27)
x <- 18

# find the value that is closest to x
maxless <- max(f[f <= x])
# find out which value that is
which(f == maxless)
18.05.2015
  • последние две строки можно записать в одну строку: which.max (f [f ‹= x]) 07.10.2019
  • @nigelhenry ваш код будет работать только тогда, когда 'f' отсортировано по возрастанию (как в примере), поскольку вы указываете индекс элемента в усеченном векторе. 30.04.2020

  • 2

    Если ваш вектор f всегда отсортирован, вы можете сделать sum(f <= x)

    f <- c(1,3,6,8,10,12,19,27)
    
    x <- 18
    sum(f <= x)
    # [1] 6
    
    x <- 19
    sum(f <= x)
    # [1] 7
    
    18.05.2015

    3

    Попробуйте это (не идеальное решение)

    x<-c(1,3,6,8,10,12,19,27)
    showIndex<-function(x,input){
     abs.diff<-abs(x-input)
     index.value<-unique(ifelse(abs.diff==0,which.min(abs.diff),which.min(abs.diff)-1))
    return(index.value)
     }
     showIndex(x,12)
        [1] 6
    showIndex(x,19)
    [1] 7
    
    18.05.2015
  • проблема в том, что если inout равен 19 ... тогда на выходе должно быть 7 (индекс) ... 19.05.2015
  • which.min(abs(x-18)) дает вам индекс. Я не понимаю, о чем вы спрашиваете. 19.05.2015
  • x [which.min (abs (x-19)) - 1] [1] 18 .... это проблема, потому что, если inpout равен 19, тогда он сопоставляет непосредственно значение, и не должно быть вычитания 1 19.05.2015

  • 4

    Вы можете попробовать:

    x <- 18
    f <- c(1,3,6,8,10,12,19,27)
    
    ifelse(x %in% f, which(f %in% x), which.min(abs(f - x)) - 1)
    

    Таким образом, если x не находится в f, он вернет ближайший предыдущий индекс. Если x находится в f, он вернет x index.

    18.05.2015
  • Бопре, как я могу убедиться, что если я найду ftr ближайшее значение 19, вещь вернет 7 (индекс 19), а не 6 (индекс 12) ... потому что вход - это точно позиция в векторе, который он нужно будет показать это ... 19.05.2015

  • 5

    Другой:

    which.min(abs(18 - replace(f, f>18, Inf)))
    #[1] 6
    
    f[which.min(abs(18 - replace(f, f>18, Inf)))]
    #[1] 12
    

    Или как функция:

    minsmaller <- function(x,value) which.min(abs(value - replace(x, x>value, Inf)))
    minsmaller(f, 18)
    #[1] 6
    minsmaller(f, 19)
    #[1] 7
    
    18.05.2015

    6

    Есть findInterval:

    findInterval(18:19, f)
    #[1] 6 7
    

    И построим более конкретную функцию:

    ff = function(x, table)
    {
        ot = order(table)
        ans = findInterval(x, table[ot]) 
        ot[ifelse(ans == 0, NA, ans)]
    }
    
    set.seed(007); sf = sample(f)
    sf
    #[1] 27  6  1 12 10 19  8  3
    ff(c(0, 1, 18, 19, 28), sf)
    #[1] NA  3  4  6  1
    
    19.05.2015

    7

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

    f <- c(1, 3, 6, 8, 10, 12, 19, 27)
    x <- 18
    Position(function(fi) fi <= x, f, right = TRUE)
    
    19.05.2015
    Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..