#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 🙂