Как создать функцию, чтобы возвращать минимальное расстояние до [-1,0,1]?

#r

#r

Вопрос:

У меня есть реальный вектор в интервале (-1,1), например:

 v = [ 0.999 0.0003 0.34 -0,95 0.63 -0.0001 0.82]
 

Я хочу создать функцию fmindistance() в R, чтобы возвращать вектор индексов всех элементов вектора v , например, расстояния от этих элементов до -1 или 0 или 1 являются минимальными.

 fmindistance <- function(vector, k){

......code ........

}
 

Например:

  v = [ 0.999 0.0003 0.34 -0,95 0.63 -0.0001 0.82] and k = 3, so:
 

Результат = [ 1 2 6]

Ответ №1:

Если я правильно понимаю, эта функция должна работать

 v<- c(0.999, 0.0003, 0.34, -0.95, 0.63, -0.0001, 0.82)

fmindistance <- function(x, targets=c(-1,0,1), k=3) {
    r<- order(sapply(x, function(z) min(abs(z - targets))))
    sort(r[1:k])
}
fmindistance(v)

#[1] 1 2 6
 

Это позволит найти ближайшие точки к любой из целей. Он вернет три ближайших по порядку индекса.

Комментарии:

1. это соответствует желаемым результатам OP, но, похоже, не соответствует формулировке их проблемы…

2. @BenBolker Чтобы получить эти результаты, я интерпретировал как минимальные расстояния от любой из этих точек, а не минимальное расстояние от каждой из этих точек. Сначала у меня было кое-что, очень похожее на ваш ответ, но я думаю, что это еще одна разумная интерпретация запроса.

3. Хорошо, оглядываясь назад (но k на самом деле никогда не определяется в их вопросе …)

4. Если я чего-то не упускаю, вы могли бы сэкономить на вводе order(sapply(x, function(z) min(abs(z - targets)))) ?

5. Да, @alexis_laz, ты прав. Было бы разумнее поменять местами мои аргументы sapply. Либо вы можете опубликовать в качестве решения, либо я могу обновить свое.

Ответ №2:

 v <- c(0.999,0.0003,0.34,-0.95,0.63,-0.0001,0.82)
ff <- function(x) {
    sapply(c(1,0,-1),
           function(y) which.min(abs(x-y)))
}
ff(v)
## [1] 1 6 4
 

Это не соответствует вашему предложенному решению, но мне кажется правильным! Если вы действительно хотите (1 2 6) в качестве решения, вам следует объяснить логику немного более тщательно…

Комментарии:

1. Ты опередил меня на несколько секунд, я писал то же самое! И я тоже получаю те же результаты 🙂

2. ооо …. на самом деле, глядя на решение MrFlick, я думаю, что решение OP может быть правильным. Может быть, ему нужны первые 3 элемента, которые ближе всего к любому из пределов… мы должны дождаться его подтверждения… 1 в любом случае для использования which.min 🙂