Положение в векторе на основе приблизительного соответствия - PullRequest
5 голосов
/ 31 августа 2011

У меня есть отсортированный вектор

m<-c(1.1, 3.2, 3.6, 4, 4.6, 4.6, 5.6, 5.7, 6.2, 8.9)

Я хочу найти позицию значения на основе приблизительного соответствия. Если значение не существует в векторе, я бы хотел, чтобы позиция непосредственно предыдущего значения

для точного соответствия я бы использовал

> match(4,m)
[1] 4

Но если я сделаю

> match(6,m)
[1] NA

То, что я хотел бы получить в этом примере, это 8 (позиция предыдущего значения 6, равного 5,7, 8 )

Заранее спасибо

Ответы [ 5 ]

10 голосов
/ 31 августа 2011

Существует встроенная функция, которая делает именно то, что вы хотите: findInterval ... Она также векторизована, так что вы можете дать ей несколько значений, чтобы найти ее за один раз, что гораздо эффективнее.

m <- c(1.1, 3.2, 3.6, 4, 4.6, 4.6, 5.6, 5.7, 6.2, 8.9)
# Find nearest (lower) index for both 4 and 6
findInterval(c(4,6), m) 
# [1] 4 8
3 голосов
/ 31 августа 2011

Используйте which.max в сочетании с подмножеством векторов, решение из 17 символов:

which.max(m[m<=6]) # Edited to specify <=
[1] 8

Поскольку ваш вектор отсортирован, вы можете использовать еще более короткое:

sum(m<=6) # Edited to specify <=
[1] 8

Это работает, потому что значение TRUE неявно преобразуется в 1 в sum

3 голосов
/ 31 августа 2011

Это должно сделать это для вас.

#v is a sorted vector and x is an item for which we want the exact or nearest lower match
lowSideMatch <- function(x, v) max(which(v <= x))

lowSideMatch(6, m)
[1] 8

lowSideMatch(4, m)
[1] 4
1 голос
/ 31 августа 2011

вы можете использовать функцию which(), чтобы получить индекс элемента с наименьшим отклонением от искомого значения.Также работает с неупорядоченными векторами.

x <- c(8,4,1,2,3,6,9)
find <- 6
pos <- which(abs(x-find) == min(abs(x-find)))
0 голосов
/ 31 августа 2011

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

> m<-c(1.1, 3.2, 3.6, 4, 4.6, 4.6, 5.6, 5.7, 6.2, 8.9)

> ( index = length(m[m<=4]) )
[1] 4

> ( m[index] )
[1] 4

> ( index = length(m[m<=6]) )
[1] 8

> ( m[index] )
[1] 5.7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...